updates.
[silc.git] / apps / irssi / src / silc / core / silc-channels.c
index f57ff33cf9a9980adc48569088bc3f65ed516dbb..3f99c37dce6e13d22871b5a22a137a5dcfb986b7 100644 (file)
@@ -93,6 +93,15 @@ static void sig_connected(SILC_SERVER_REC *server)
     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.
  */
@@ -285,10 +294,8 @@ static void event_cmode(SILC_SERVER_REC *server, va_list va)
     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);
@@ -321,18 +328,16 @@ static void event_cumode(SILC_SERVER_REC *server, va_list va)
        (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);
 }
@@ -394,13 +399,15 @@ static void event_ban(SILC_SERVER_REC *server, va_list va)
 
 }
 
+/* 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))
@@ -421,10 +428,97 @@ static void command_part(const char *data, SILC_SERVER_REC *server,
   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);
@@ -442,6 +536,8 @@ void silc_channels_init(void)
   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();
 }
@@ -450,6 +546,7 @@ void silc_channels_deinit(void)
 {
   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);
@@ -469,6 +566,8 @@ void silc_channels_deinit(void)
   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();
 }