summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2023-08-10 03:20:10 -0400
committerTest_User <hax@andrewyu.org>2023-08-10 03:20:10 -0400
commit833f715ec2a6917c0afb4300e6505b135410ec3a (patch)
tree2db0dede15484873564ee3f56b7f7bddbf8cf805
parentc58679ab1055fc48e31ebc661d38f470bdec3142 (diff)
downloadcoupserv-833f715ec2a6917c0afb4300e6505b135410ec3a.tar.gz
coupserv-833f715ec2a6917c0afb4300e6505b135410ec3a.zip
privmsg() now takes an array rather than a single string, more stuff switched from server-only to privmsg()
-rw-r--r--client_network.c17
-rw-r--r--commands.c25
-rw-r--r--general_network.c8
-rw-r--r--network.h2
-rw-r--r--server_network.c29
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 {