diff --git a/src/server/include/net.h b/src/server/include/net.h index afce07d32c9eb55f4b6509fd0a4066d2137b6607..c1d743cf2dfeae3dba50e65ed82b8aff2427b360 100644 --- a/src/server/include/net.h +++ b/src/server/include/net.h @@ -28,6 +28,7 @@ void net_server_iddqd(gpointer ref); void net_server_broadcast_message(const gchar *msg, gpointer ref); void net_server_direct_message(const gchar *msg, gpointer ref); void net_server_set_nickname(const gchar *nick, gpointer ref); +int net_server_parse_msg(const gchar *msg, gpointer ref); #endif /* _SERVER_INCLUDE_NET_H_ */ diff --git a/src/server/net.c b/src/server/net.c index 6d28d43aff1b652916523de0b19c4766f86e4152..67903b34cf0565f23b3fd70c75c82656ec87002c 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -174,6 +174,25 @@ exit: return G_SOURCE_REMOVE; } +static void net_push_motd_update(void) +{ + gchar *buf; + gchar *motd; + + + motd = server_cfg_get_motd(); + if (!motd) + return; + + buf = g_strdup_printf("The MOTD has been updated and now reads: " + "\n\n%s\n\n", motd); + + net_server_broadcast_message(buf, NULL); + + g_free(buf); + g_free(motd); +} + /** * @brief distribute a list of users to all clients @@ -205,7 +224,6 @@ static gboolean net_push_userlist_cb(gpointer data) tmp = msg; - g_message("%s priv is %d", c->nick, c->priv); switch (c->priv) { case PRIV_FULL: buf = g_strdup_printf("<tt><span foreground='#FF0000'>" @@ -1034,6 +1052,33 @@ void net_server_set_nickname(const gchar *nick, gpointer ref) +int net_server_parse_msg(const gchar *msg, gpointer ref) +{ + struct con_data *c; + + + c = (struct con_data *) ref; + + /* ignore if not fully priviledged */ + if (c->priv < PRIV_FULL) + return -1; + + /* shorter than our only supported command word */ + if (strlen(msg) < 5) + return -1; + + if (strncmp(msg, "!motd", 5)) + return -1; + + /* stupidly set the motd */ + server_cfg_set_motd(&msg[5]); + + net_push_motd_update(); + + return 0; +} + + /** * @brief broadcast a text message to all clients */ diff --git a/src/server/proc/proc_pr_message.c b/src/server/proc/proc_pr_message.c index 2bc91b216828430d6965ee5278700cab17588ba4..85ce91d3758cc78cc3fe45c2555ba56830dcf4f8 100644 --- a/src/server/proc/proc_pr_message.c +++ b/src/server/proc/proc_pr_message.c @@ -35,5 +35,9 @@ void proc_pr_message(struct packet *pkt, gpointer ref) if (strlen((gchar *) c->message) != c->len) return; + /* see if it is an interpretable command */ + if (!net_server_parse_msg((const gchar *) c->message, ref)) + return; + net_server_broadcast_message((const gchar *) c->message, ref); }