From 833f715ec2a6917c0afb4300e6505b135410ec3a Mon Sep 17 00:00:00 2001 From: Test_User Date: Thu, 10 Aug 2023 03:20:10 -0400 Subject: privmsg() now takes an array rather than a single string, more stuff switched from server-only to privmsg() --- client_network.c | 17 +++++++++-------- commands.c | 25 ++++++++----------------- general_network.c | 8 +++++--- network.h | 2 +- server_network.c | 29 +++++++++++------------------ 5 files changed, 34 insertions(+), 47 deletions(-) diff --git a/client_network.c b/client_network.c index 37e3e8a..42d0acc 100644 --- a/client_network.c +++ b/client_network.c @@ -431,14 +431,15 @@ int client_privmsg_handler(uint64_t argc, struct string *argv) { struct command_def *cmd = get_table_index(user_commands, command_argv[0]); if (cmd) { if (!cmd->local_only) { - SEND(STRING(":1HC000000 PRIVMSG ")); - SEND(log_channel); - SEND(STRING(" :Local user ")); - SEND(client_nick); - - SEND(STRING(" executes `")); - SEND(argv[1]); - SEND(STRING("'\n")); + struct string message[] = { + STRING("Local user "), + client_nick, + STRING(" executes `"), + argv[1], + STRING("'\n"), + }; + + privmsg(STRING("1HC000000"), log_channel, sizeof(message)/sizeof(*message), message); return cmd->func(STRING("1HC000001"), argv[1], argv[0], command_argc, command_argv); } else { diff --git a/commands.c b/commands.c index e7ba6cb..1928281 100644 --- a/commands.c +++ b/commands.c @@ -43,23 +43,14 @@ int help_command(struct string sender, struct string original_message, struct st for (uint64_t i = 0; i < user_commands.len; i++) { struct command_def *def = user_commands.array[i].ptr; - uint64_t len = command_prefix.len; - len += user_commands.array[i].name.len; - len += 2; - len += def->summary.len; - - char data[len]; - struct string message = {.data = data, .len = len}; - uint64_t offset = 0; - memcpy(&(message.data[offset]), command_prefix.data, command_prefix.len); - offset += command_prefix.len; - memcpy(&(message.data[offset]), user_commands.array[i].name.data, user_commands.array[i].name.len); - offset += user_commands.array[i].name.len; - memcpy(&(message.data[offset]), "\x0F" " ", 2); - offset += 2; - memcpy(&(message.data[offset]), def->summary.data, def->summary.len); - - privmsg(STRING("1HC000000"), to, message); + struct string message[] = { + command_prefix, + user_commands.array[i].name, + STRING("\x0F" " "), + def->summary, + }; + + privmsg(STRING("1HC000000"), to, sizeof(message)/sizeof(*message), message); } return 0; diff --git a/general_network.c b/general_network.c index 14c3eb8..9676c2b 100644 --- a/general_network.c +++ b/general_network.c @@ -82,7 +82,7 @@ char channel_mode_types[UCHAR_MAX] = { ['X'] = MODE_TYPE_MULTIPLE, }; -int privmsg(struct string source, struct string target, struct string message) { +int privmsg(struct string source, struct string target, size_t num_message_parts, struct string message[num_message_parts]) { if (!STRING_EQ(target, STRING("1HC000001"))) { // if not sending to our one local user if (source.len != 0) { SEND(STRING(":")); @@ -94,7 +94,8 @@ int privmsg(struct string source, struct string target, struct string message) { SEND(target); SEND(STRING(" :")); - SEND(message); + for (size_t i = 0; i < num_message_parts; i++) + SEND(message[i]); SEND(STRING("\n")); } else { goto privmsg_client; @@ -137,7 +138,8 @@ int privmsg(struct string source, struct string target, struct string message) { SENDCLIENT(target); SENDCLIENT(STRING(" :")); - SENDCLIENT(message); + for (size_t i = 0; i < num_message_parts; i++) + SENDCLIENT(message[i]); SENDCLIENT(STRING("\r\n")); return 0; diff --git a/network.h b/network.h index 539d052..a20deb3 100644 --- a/network.h +++ b/network.h @@ -112,6 +112,6 @@ extern ssize_t SENDCLIENT(struct string msg); #define SENDCLIENT(x) write(client_fd, x.data, x.len) #endif -extern int privmsg(struct string source, struct string target, struct string message); +extern int privmsg(struct string source, struct string target, size_t num_message_parts, struct string message[num_message_parts]); extern int add_local_client(struct string uid, struct string nick_arg, struct string vhost_arg, struct string ident_arg, struct string realname_arg, time_t timestamp); extern int remove_user(struct string uid, struct string reason); diff --git a/server_network.c b/server_network.c index 3d69341..342b254 100644 --- a/server_network.c +++ b/server_network.c @@ -620,7 +620,9 @@ int privmsg_handler(struct string sender, uint64_t argc, struct string *argv) { } struct user_info *user = get_table_index(user_list, sender); + struct server_info *server; if (user) { + server = 0; if (argv[0].data[0] == '#') { struct channel_info *channel = get_table_index(channel_list, argv[0]); if (channel && has_table_index(channel->user_list, STRING("1HC000001"))) { @@ -650,7 +652,7 @@ int privmsg_handler(struct string sender, uint64_t argc, struct string *argv) { SENDCLIENT(STRING("\r\n")); } } else { - struct server_info *server = get_table_index(server_list, sender); + server = get_table_index(server_list, sender); if (server) { if (argv[0].data[0] == '#') { struct channel_info *channel = get_table_index(channel_list, argv[0]); @@ -752,24 +754,15 @@ int privmsg_handler(struct string sender, uint64_t argc, struct string *argv) { } } - SEND(STRING(":1HC000000 PRIVMSG ")); - SEND(log_channel); - if (sender.len == 3) { - SEND(STRING(" :Server ")); - SEND(sender); - } else { - struct user_info *user = get_table_index(user_list, sender); - if (user) { - SEND(STRING(" :User ")); - SEND(user->nick); - } else { - SEND(STRING(" :An unknown user (something desycned... this shouldn't happen)")); - } - } + struct string message[] = { + user ? STRING("User ") : (server ? STRING("Server ") : STRING("An unknown user (something desycned... this shouldn't happen)")), + user ? user->nick : (server ? server->address : STRING("")), + STRING(" executes `"), + argv[1], + STRING("'\n"), + }; - SEND(STRING(" executes `")); - SEND(argv[1]); - SEND(STRING("'\n")); + privmsg(STRING("1HC000000"), log_channel, sizeof(message)/sizeof(*message), message); return cmd->func(sender, argv[1], argv[0], command_argc, command_argv); } else { -- cgit v1.2.3