updates.
[silc.git] / apps / irssi / src / silc / core / silc-channels.c
index c02d61d2fc4e9724538a831d38b83fd3221db2ad..fa50947d524c06187b2fe04d821043e89d3f6ca5 100644 (file)
@@ -151,14 +151,9 @@ static void event_join(SILC_SERVER_REC *server, va_list va)
   } else {
     chanrec = silc_channel_find_entry(server, channel);
     if (chanrec != NULL) {
-      SilcChannelUser user;
-
-      silc_list_start(chanrec->entry->clients);
-      while ((user = silc_list_get(chanrec->entry->clients)) != NULL)
-       if (user->client == client) {
-         nickrec = silc_nicklist_insert(chanrec, user, TRUE);
-         break;
-       }
+      SilcChannelUser chu = silc_client_on_channel(channel, client);
+      if (chu)
+       nickrec = silc_nicklist_insert(chanrec, chu, TRUE);
     }
   }
 
@@ -242,17 +237,19 @@ static void event_signoff(SILC_SERVER_REC *server, va_list va)
 static void event_topic(SILC_SERVER_REC *server, va_list va)
 {
   SILC_CHANNEL_REC *chanrec;
+  void *entry;
   SilcClientEntry client;
+  SilcServerEntry server_entry;
   SilcChannelEntry channel;
   char *topic;
   char userhost[256];
+  SilcIdType idtype;
 
-  client = va_arg(va, SilcClientEntry);
+  idtype = va_arg(va, int);
+  entry = va_arg(va, void *);
   topic = va_arg(va, char *);
   channel = va_arg(va, SilcChannelEntry);
 
-  silc_server_free_ftp(server, client);
-
   chanrec = silc_channel_find_entry(server, channel);
   if (chanrec != NULL) {
     g_free_not_null(chanrec->topic);
@@ -260,11 +257,23 @@ static void event_topic(SILC_SERVER_REC *server, va_list va)
     signal_emit("channel topic changed", 1, chanrec);
   }
 
-  memset(userhost, 0, sizeof(userhost));
-  snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
-          client->username, client->hostname);
-  signal_emit("message topic", 5, server, channel->channel_name,
-             topic, client->nickname, userhost);
+  if (idtype == SILC_ID_CLIENT) {
+    client = (SilcClientEntry)entry;
+    memset(userhost, 0, sizeof(userhost));
+    snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
+            client->username, client->hostname);
+    signal_emit("message topic", 5, server, channel->channel_name,
+               topic, client->nickname, userhost);
+  } else if (idtype == SILC_ID_SERVER) {
+    server_entry = (SilcServerEntry)entry;
+    signal_emit("message topic", 5, server, channel->channel_name,
+               topic, server_entry->server_name, 
+               server_entry->server_name);
+  } else {
+    channel = (SilcChannelEntry)entry;
+    signal_emit("message topic", 5, server, channel->channel_name,
+               topic, channel->channel_name, channel->channel_name);
+  }
 }
 
 /*
@@ -449,6 +458,8 @@ static void event_server_signoff(SILC_SERVER_REC *server, va_list va)
   clients_count = va_arg(va, uint32);
   
   for (i = 0; i < clients_count; i++) {
+    GSList *nicks, *tmp;
+
     memset(userhost, 0, sizeof(userhost));
     if (clients[i]->username)
       snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
@@ -456,6 +467,15 @@ static void event_server_signoff(SILC_SERVER_REC *server, va_list va)
     signal_emit("message quit", 4, server, clients[i]->nickname,
                clients[i]->username ? userhost : "", 
                "server signoff");
+
+    silc_server_free_ftp(server, clients[i]);
+
+    nicks = nicklist_get_same_unique(SERVER(server), clients[i]);
+    for (tmp = nicks; tmp != NULL; tmp = tmp->next->next) {
+      CHANNEL_REC *channel = tmp->data;
+      NICK_REC *nickrec = tmp->next->data;
+      nicklist_remove(channel, nickrec);
+    }
   }
 }
 
@@ -466,13 +486,14 @@ static void event_server_signoff(SILC_SERVER_REC *server, va_list va)
 static void event_kick(SILC_SERVER_REC *server, va_list va)
 {
   SilcClientConnection conn = server->conn;
-  SilcClientEntry client_entry;
+  SilcClientEntry client_entry, kicker;
   SilcChannelEntry channel_entry;
   char *tmp;
   SILC_CHANNEL_REC *chanrec;
 
   client_entry = va_arg(va, SilcClientEntry);
   tmp = va_arg(va, char *);
+  kicker = va_arg(va, SilcClientEntry);
   channel_entry = va_arg(va, SilcChannelEntry);
 
   chanrec = silc_channel_find_entry(server, channel_entry);
@@ -480,6 +501,7 @@ static void event_kick(SILC_SERVER_REC *server, va_list va)
   if (client_entry == conn->local_entry) {
     printformat_module("fe-common/silc", server, channel_entry->channel_name,
                       MSGLEVEL_CRAP, SILCTXT_CHANNEL_KICKED_YOU, 
+                      kicker->nickname,
                       channel_entry->channel_name, tmp ? tmp : "");
     if (chanrec) {
       chanrec->kicked = TRUE;
@@ -489,6 +511,7 @@ static void event_kick(SILC_SERVER_REC *server, va_list va)
     printformat_module("fe-common/silc", server, channel_entry->channel_name,
                       MSGLEVEL_CRAP, SILCTXT_CHANNEL_KICKED, 
                       client_entry->nickname,
+                      kicker->nickname,
                       channel_entry->channel_name, tmp ? tmp : "");
 
     if (chanrec) {
@@ -796,6 +819,11 @@ static void keyagr_completion(SilcClient client,
                       SILCTXT_KEY_AGREEMENT_TIMEOUT, client_entry->nickname);
     break;
     
+  case SILC_KEY_AGREEMENT_ABORTED:
+    printformat_module("fe-common/silc", i->server, NULL, MSGLEVEL_CRAP,
+                      SILCTXT_KEY_AGREEMENT_ABORTED, client_entry->nickname);
+    break;
+    
   default:
     break;
   }