summaryrefslogtreecommitdiff
path: root/userland
diff options
context:
space:
mode:
Diffstat (limited to 'userland')
-rw-r--r--userland/irc/irc.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/userland/irc/irc.c b/userland/irc/irc.c
index b69e1dd..297c332 100644
--- a/userland/irc/irc.c
+++ b/userland/irc/irc.c
@@ -129,20 +129,26 @@ void msg_sv_println(struct sv s) {
}
void msg_sv_print(struct sv s) {
+ char buffer[4096];
+ int buffer_pos = 0;
+ mvcursor(message_pos_x, message_pos_y);
for (size_t i = 0; i < s.length; i++) {
- mvcursor(message_pos_x, message_pos_y);
- if ('\n' == s.s[i]) {
- message_pos_x = 0;
- message_pos_y++;
- continue;
- }
- printf("%c", s.s[i]);
+ buffer[buffer_pos] = s.s[i];
+ buffer_pos++;
message_pos_x++;
- if (message_pos_x > TERMINAL_WIDTH) {
+ if ('\n' == s.s[i] || message_pos_x > TERMINAL_WIDTH) {
+ buffer[buffer_pos] = '\0';
+ printf("%s", buffer);
+ buffer_pos = 0;
message_pos_x = 0;
message_pos_y++;
+ mvcursor(message_pos_x, message_pos_y);
}
}
+ if (0 != buffer_pos) {
+ buffer[buffer_pos] = '\0';
+ printf("%s", buffer);
+ }
mvcursor(prompt_x, prompt_y);
}
@@ -154,8 +160,10 @@ void msg_sv_print(struct sv s) {
#define RPL_LUSERCLIENT C_TO_SV("251")
#define RPL_NOTOPIC C_TO_SV("331")
#define RPL_TOPIC C_TO_SV("332")
-#define ERR_NOMOTD C_TO_SV("422")
+#define RPL_NAMREPLY C_TO_SV("353")
+#define RPL_ENDOFNAMES C_TO_SV("366")
+#define ERR_NOMOTD C_TO_SV("422")
#define RPL_MOTDSTART C_TO_SV("375")
#define RPL_MOTD C_TO_SV("372")
#define RPL_ENDOFMOTD C_TO_SV("376")
@@ -234,6 +242,29 @@ void handle_msg(struct irc_server *server, struct sv msg) {
msg = sv_trim_left(msg, 1);
irc_add_message(server, channel, nick, msg);
}
+ HANDLE_CMD(RPL_NAMREPLY) {
+ struct sv intended_recipient =
+ sv_split_delim(command_parameters, &command_parameters, ' ');
+ struct sv channel_status =
+ sv_split_delim(command_parameters, &command_parameters, ' ');
+ (void)channel_status;
+ struct sv channel =
+ sv_split_delim(command_parameters, &command_parameters, ' ');
+ // Remove the ':'
+ command_parameters = sv_trim_left(command_parameters, 1);
+ if (sv_eq(intended_recipient, server_nick)) {
+ struct sb user_list_message;
+ sb_init(&user_list_message);
+ sb_append(&user_list_message, "Users on ");
+ sb_append_sv(&user_list_message, channel);
+ sb_append(&user_list_message, ": ");
+ sb_append_sv(&user_list_message, command_parameters);
+ irc_add_message(server, channel, C_TO_SV("*"), SB_TO_SV(user_list_message));
+ sb_free(&user_list_message);
+ }
+ }
+ PASSTHROUGH_CHANNEL_CMD(RPL_ENDOFNAMES)
+
PASSTHROUGH_CHANNEL_CMD(RPL_NOTOPIC)
PASSTHROUGH_CHANNEL_CMD(RPL_TOPIC)