server->channels_join = (void *) silc_channels_join;
}
+/* "server quit" signal from the core to indicate that QUIT command
+ was called. */
+
+static void sig_server_quit(SILC_SERVER_REC *server, const char *msg)
+{
+ if (IS_SILC_SERVER(server))
+ silc_command_exec(server, "QUIT", msg);
+}
+
/*
* "event join". Joined to a channel.
*/
signal_emit("channel mode changed", 1, chanrec);
}
- /*signal_emit("message mode", 5, server, chanrec->name,
- client->nickname, client->username, mode);*/
printtext(server, channel->channel_name, MSGLEVEL_MODES,
- "mode/%s [%s] by %s", channel->channel_name, mode,
+ "cmode/%s [%s] by %s", channel->channel_name, mode,
client->nickname);
g_free(mode);
(mode & SILC_CHANNEL_UMODE_CHANOP) != 0;
}
- nick = silc_nicklist_find(chanrec, client);
+ nick = silc_nicklist_find(chanrec, destclient);
if (nick != NULL) {
nick->op = (mode & SILC_CHANNEL_UMODE_CHANOP) != 0;
signal_emit("nick mode changed", 2, chanrec, nick);
}
}
- /*signal_emit("message mode", 5, server, chanrec->name,
- client->nickname, client->username, modestr);*/
printtext(server, channel->channel_name, MSGLEVEL_MODES,
- "mode/%s [%s] by %s", channel->channel_name, modestr,
- client->nickname);
+ "cumode/%s/%s [%s] by %s", destclient->nickname,
+ channel->channel_name, modestr, client->nickname);
g_free(modestr);
}
}
+/* PART (LEAVE) command. */
+
static void command_part(const char *data, SILC_SERVER_REC *server,
WI_ITEM_REC *item)
{
SILC_CHANNEL_REC *chanrec;
if (!IS_SILC_SERVER(server) || !server->connected)
- return;
+ cmd_return_error(CMDERR_NOT_CONNECTED);
if (*data == '\0') {
if (!IS_SILC_CHANNEL(item))
channel_destroy(CHANNEL(chanrec));
}
+/* ME local command. */
+
+static void command_me(const char *data, SILC_SERVER_REC *server,
+ WI_ITEM_REC *item)
+{
+ SILC_CHANNEL_REC *chanrec;
+ char *tmpcmd = "ME", *tmp;
+ uint32 argc = 0;
+ unsigned char **argv;
+ uint32 *argv_lens, *argv_types;
+ int i;
+
+ if (!IS_SILC_SERVER(server) || !server->connected)
+ cmd_return_error(CMDERR_NOT_CONNECTED);
+
+ if (!IS_SILC_CHANNEL(item))
+ cmd_return_error(CMDERR_NOT_JOINED);
+
+ /* Now parse all arguments */
+ tmp = g_strconcat(tmpcmd, " ", data, NULL);
+ silc_parse_command_line(tmp, &argv, &argv_lens,
+ &argv_types, &argc, 2);
+ g_free(tmp);
+
+ if (argc < 2)
+ cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
+
+ chanrec = silc_channel_find(server, item->name);
+ if (chanrec == NULL)
+ cmd_return_error(CMDERR_CHAN_NOT_FOUND);
+
+ /* Send the action message */
+ silc_client_send_channel_message(silc_client, server->conn,
+ chanrec->entry, NULL,
+ SILC_MESSAGE_FLAG_ACTION,
+ argv[1], argv_lens[1], TRUE);
+
+ for (i = 0; i < argc; i++)
+ silc_free(argv[i]);
+ silc_free(argv_lens);
+ silc_free(argv_types);
+}
+
+/* NOTICE local command. */
+
+static void command_notice(const char *data, SILC_SERVER_REC *server,
+ WI_ITEM_REC *item)
+{
+ SILC_CHANNEL_REC *chanrec;
+ char *tmpcmd = "ME", *tmp;
+ uint32 argc = 0;
+ unsigned char **argv;
+ uint32 *argv_lens, *argv_types;
+ int i;
+
+ if (!IS_SILC_SERVER(server) || !server->connected)
+ cmd_return_error(CMDERR_NOT_CONNECTED);
+
+ if (!IS_SILC_CHANNEL(item))
+ cmd_return_error(CMDERR_NOT_JOINED);
+
+ /* Now parse all arguments */
+ tmp = g_strconcat(tmpcmd, " ", data, NULL);
+ silc_parse_command_line(tmp, &argv, &argv_lens,
+ &argv_types, &argc, 2);
+ g_free(tmp);
+
+ if (argc < 2)
+ cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
+
+ chanrec = silc_channel_find(server, item->name);
+ if (chanrec == NULL)
+ cmd_return_error(CMDERR_CHAN_NOT_FOUND);
+
+ /* Send the action message */
+ silc_client_send_channel_message(silc_client, server->conn,
+ chanrec->entry, NULL,
+ SILC_MESSAGE_FLAG_NOTICE,
+ argv[1], argv_lens[1], TRUE);
+
+ for (i = 0; i < argc; i++)
+ silc_free(argv[i]);
+ silc_free(argv_lens);
+ silc_free(argv_types);
+}
+
void silc_channels_init(void)
{
signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
signal_add("server connected", (SIGNAL_FUNC) sig_connected);
+ signal_add("server quit", (SIGNAL_FUNC) sig_server_quit);
signal_add("silc event join", (SIGNAL_FUNC) event_join);
signal_add("silc event leave", (SIGNAL_FUNC) event_leave);
signal_add("silc event ban", (SIGNAL_FUNC) event_ban);
command_bind("part", MODULE_NAME, (SIGNAL_FUNC) command_part);
+ command_bind("me", MODULE_NAME, (SIGNAL_FUNC) command_me);
+ command_bind("notice", MODULE_NAME, (SIGNAL_FUNC) command_notice);
silc_nicklist_init();
}
{
signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
signal_remove("server connected", (SIGNAL_FUNC) sig_connected);
+ signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit);
signal_remove("silc event join", (SIGNAL_FUNC) event_join);
signal_remove("silc event leave", (SIGNAL_FUNC) event_leave);
signal_remove("silc event ban", (SIGNAL_FUNC) event_ban);
command_unbind("part", (SIGNAL_FUNC) command_part);
+ command_unbind("me", (SIGNAL_FUNC) command_me);
+ command_unbind("notice", (SIGNAL_FUNC) command_notice);
silc_nicklist_deinit();
}