+static IRC_CMD(raw_251) {
+ if(argc < 2) return 0;
+ char *total_user_str = argv[1];
+ char total_visible[20], total_invisible[20];
+ int i = 0, total_visible_pos = 0, total_invisible_pos = 0;
+ while(*total_user_str) {
+ if(*total_user_str == ' ') {
+ i++;
+ } else if(i == 2) {
+ if(total_visible_pos < 20)
+ total_visible[total_visible_pos++] = *total_user_str;
+ } else if(i == 5) {
+ if(total_invisible_pos < 20)
+ total_invisible[total_invisible_pos++] = *total_user_str;
+ }
+ total_user_str++;
+ }
+ total_visible[total_visible_pos] = '\0';
+ total_invisible[total_invisible_pos] = '\0';
+ statistics_network_users = atoi(total_visible) + atoi(total_invisible);
+ return 1;
+}
+
+static IRC_CMD(raw_254) {
+ if(argc < 3) return 0;
+ statistics_network_channels = atoi(argv[1]);
+ statistics_update();
+ return 1;
+}
+
+static IRC_CMD(raw_332) {
+ //Skynet #neonserv :topic
+ struct ChanNode *chan = getChanByName(argv[1]);
+ if(!chan) return 0;
+ strcpy(chan->topic, argv[2]);
+ return 1;
+}
+
+struct ClientRenamePartedChannel {
+ char channel[CHANNELLEN+1];
+ struct ClientRenamePartedChannel *next;
+};
+
+static IRC_CMD(raw_437) { //can NOT change nick
+ struct ClientRenamePartedChannel *partedchan = malloc(sizeof(*partedchan));
+ strcpy(partedchan->channel, argv[1]);
+ if((client->flags & SOCKET_FLAG_CHANGENICK))
+ partedchan->next = client->changenick_channels;
+ else
+ partedchan->next = NULL;
+ client->changenick_channels = partedchan;
+ client->flags |= SOCKET_FLAG_CHANGENICK;
+ putsock(client, "PART %s", argv[1]);
+ putsock(client, "NICK %s", client->nick);
+ return 1;
+}
+
+static void client_renamed(struct ClientSocket *client) {
+ if((client->flags & SOCKET_FLAG_CHANGENICK)) {
+ struct ClientRenamePartedChannel *partedchan, *nextchan;
+ for(partedchan = client->changenick_channels; partedchan; partedchan = nextchan) {
+ nextchan = partedchan->next;
+ putsock(client, "JOIN %s", partedchan->channel);
+ free(partedchan);
+ }
+ client->flags &= ~SOCKET_FLAG_CHANGENICK;
+ }
+}
+