2
* $Id: xmpp-channels.c,v 1.31 2008/03/01 17:57:21 errtu Exp $
4
* Copyright (C) 2007 Colin DIDIER
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License along
16
* with this program; if not, write to the Free Software Foundation, Inc.,
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23
#include "channels-setup.h"
28
#include "xmpp-channels.h"
29
#include "xmpp-nicklist.h"
30
#include "xmpp-protocol.h"
31
#include "xmpp-rosters-tools.h"
32
#include "xmpp-tools.h"
35
* XEP-0045: Multi-User Chat
39
xmpp_channel_create(XMPP_SERVER_REC *server, const char *name,
40
const char *visible_name, int automatic, const char *nick)
42
XMPP_CHANNEL_REC *rec;
44
g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
45
g_return_val_if_fail(name != NULL, NULL);
47
rec = g_new0(XMPP_CHANNEL_REC, 1);
48
rec->chat_type = XMPP_PROTOCOL;
50
rec->nick = g_strdup((nick != NULL) ? nick :
51
(*settings_get_str("nick") != '\0') ?
52
settings_get_str("nick") : server->user);
55
channel_init((CHANNEL_REC *)rec, SERVER(server), name, visible_name,
58
return (CHANNEL_REC *)rec;
62
xmpp_channel_send_message(XMPP_SERVER_REC *server, const char *name,
66
char *room, *message_recoded;
68
g_return_if_fail(IS_XMPP_SERVER(server));
69
g_return_if_fail(name != NULL);
70
g_return_if_fail(message != NULL);
72
room = xmpp_recode_out(name);
73
msg = lm_message_new_with_sub_type(room,
74
LM_MESSAGE_TYPE_MESSAGE, LM_MESSAGE_SUB_TYPE_GROUPCHAT);
77
message_recoded = xmpp_recode_out(message);
78
lm_message_node_add_child(msg->node, "body", message_recoded);
79
g_free(message_recoded);
81
lm_send(server, msg, NULL);
82
lm_message_unref(msg);
86
channel_find_server(SERVER_REC *server, const char *channel_name)
91
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
94
if (channel->chat_type != server->chat_type)
97
if (g_strcasecmp(channel_name, channel->name) == 0)
105
send_nick(XMPP_CHANNEL_REC *channel, const char *nick)
108
LmMessageNode *child;
109
char *room, *recoded, *str;
111
g_return_if_fail(channel != NULL);
112
g_return_if_fail(IS_XMPP_SERVER(channel->server));
114
if (!channel->server->connected)
117
room = g_strconcat(channel->name, "/", nick, NULL);
118
recoded = xmpp_recode_out(room);
121
msg = lm_message_new(recoded, LM_MESSAGE_TYPE_PRESENCE);
124
child = lm_message_node_add_child(msg->node, "x", NULL);
125
lm_message_node_set_attribute(child, "xmlns", XMLNS_MUC);
127
if (!channel->joined) {
128
if (channel->key != NULL) {
129
recoded = xmpp_recode_out(channel->key);
130
lm_message_node_add_child(child, "password", recoded);
134
child = lm_message_node_add_child(child, "history", NULL);
135
str = g_strdup_printf("%d",
136
settings_get_int("xmpp_history_maxstanzas"));
137
lm_message_node_set_attribute(child, "maxstanzas", str);
140
if (channel->server->show != XMPP_PRESENCE_AVAILABLE) {
141
recoded = xmpp_recode_out(
142
xmpp_presence_show[channel->server->show]);
143
lm_message_node_add_child(msg->node, "show", recoded);
147
if (channel->server->away_reason != NULL) {
148
recoded = xmpp_recode_out(
149
channel->server->away_reason);
150
lm_message_node_add_child(msg->node, "status",
156
lm_send(channel->server, msg, NULL);
157
lm_message_unref(msg);
161
send_disco(XMPP_CHANNEL_REC *channel)
164
LmMessageNode *child;
167
g_return_if_fail(channel != NULL);
168
g_return_if_fail(IS_XMPP_SERVER(channel->server));
170
room_recoded = xmpp_recode_out(channel->name);
171
msg = lm_message_new_with_sub_type(room_recoded,
172
LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
173
g_free(room_recoded);
175
child = lm_message_node_add_child(msg->node, "x", NULL);
176
lm_message_node_set_attribute(child, "xmlns", XMLNS_DISCO_INFO);
178
lm_send(channel->server, msg, NULL);
179
lm_message_unref(msg);
183
send_join(XMPP_SERVER_REC *server, XMPP_CHANNEL_REC *channel)
185
g_return_if_fail(IS_XMPP_SERVER(server));
186
g_return_if_fail(channel != NULL);
188
if (!server->connected)
192
send_nick(channel, channel->nick);
196
channel_join(XMPP_SERVER_REC *server, const char *data, int automatic)
198
XMPP_CHANNEL_REC *channel;
199
char *chanline, *channame, *nick, *key;
202
g_return_if_fail(IS_XMPP_SERVER(server));
203
g_return_if_fail(data != NULL);
205
g_strstrip((char *)data);
206
if (!server->connected || *data == '\0')
209
if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST,
213
nick = xmpp_extract_nick(chanline);
214
channame = xmpp_extract_channel(chanline);
216
if (xmpp_channel_find(server, channame) == NULL) {
217
channel = (XMPP_CHANNEL_REC *)xmpp_channel_create(server,
218
channame, NULL, automatic, nick);
220
channel->key = (key == NULL || *key == '\0') ?
221
NULL : g_strdup(key);
222
send_join(server, channel);
227
cmd_params_free(free_arg);
231
xmpp_channels_join(XMPP_SERVER_REC *server, const char *data, int automatic)
233
/* ignore automatic joins from irssi */
237
channel_join(server, data, FALSE);
241
xmpp_channels_join_automatic(XMPP_SERVER_REC *server, const char *data)
243
channel_join(server, data, TRUE);
247
xmpp_channels_invite(XMPP_SERVER_REC *server, const char *room,
250
XMPP_CHANNEL_REC *channel;
252
LmMessageNode *child, *invite;
253
char *room_recoded, *dest_recoded;
255
g_return_if_fail(IS_XMPP_SERVER(server));
256
g_return_if_fail(room != NULL);
257
g_return_if_fail(dest != NULL);
259
dest_recoded = xmpp_recode_out(dest);
260
msg = lm_message_new(dest_recoded, LM_MESSAGE_TYPE_MESSAGE);
261
g_free(dest_recoded);
263
child = lm_message_node_add_child(msg->node, "x", NULL);
264
lm_message_node_set_attribute(child, "xmlns", XMLNS_MUC);
266
invite = lm_message_node_add_child(child, "invite", NULL);
267
room_recoded = xmpp_recode_out(room);
268
lm_message_node_set_attribute(invite, "to", room_recoded);
269
g_free(room_recoded);
271
if ((channel = xmpp_channel_find(server, room)) != NULL &&
272
channel->key != NULL)
273
lm_message_node_add_child(child, "password",
276
lm_send(server, msg, NULL);
277
lm_message_unref(msg);
281
send_part(XMPP_SERVER_REC *server, XMPP_CHANNEL_REC *channel,
285
LmMessageNode *child;
286
char *room, *room_recoded, *reason_recoded;
288
g_return_if_fail(IS_XMPP_SERVER(server));
289
g_return_if_fail(channel != NULL);
291
if (!server->connected)
294
room = g_strconcat(channel->name, "/", channel->nick, NULL);
295
room_recoded = xmpp_recode_out(room);
298
msg = lm_message_new_with_sub_type(room_recoded,
299
LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_UNAVAILABLE);
300
g_free(room_recoded);
302
child = lm_message_node_add_child(msg->node, "x", NULL);
303
lm_message_node_set_attribute(child, "xmlns", XMLNS_MUC);
305
if (reason != NULL) {
306
reason_recoded = xmpp_recode_out(reason);
307
child = lm_message_node_add_child(msg->node, "status",
309
g_free(reason_recoded);
312
lm_send(server, msg, NULL);
313
lm_message_unref(msg);
317
sig_part(XMPP_SERVER_REC *server, const char *channame,
320
XMPP_CHANNEL_REC *channel;
322
g_return_if_fail(IS_XMPP_SERVER(server));
323
g_return_if_fail(channame != NULL);
325
g_strstrip((char *)channame);
326
channel = xmpp_channel_find(server, channame);
327
if (channel != NULL) {
328
send_part(server, channel, reason);
329
channel->left = TRUE;
331
if (channel->ownnick != NULL)
332
signal_emit("message part", 5, server,
333
channel->name, channel->ownnick->nick,
334
channel->ownnick->host, reason);
336
channel_destroy(CHANNEL(channel));
341
sig_own_nick(XMPP_SERVER_REC *server, const char *channame, const char *nick)
343
XMPP_CHANNEL_REC *channel;
345
g_return_if_fail(IS_XMPP_SERVER(server));
346
g_return_if_fail(channame != NULL);
347
g_return_if_fail(nick != NULL);
349
g_strstrip((char *)channame);
350
channel = xmpp_channel_find(server, channame);
352
send_nick(channel, nick);
356
sig_topic(XMPP_CHANNEL_REC *channel, const char *topic, const char *nick_name)
358
g_return_if_fail(channel != NULL);
360
if (channel->topic != NULL && topic != NULL
361
&& strcmp(channel->topic, topic) == 0)
364
g_free(channel->topic);
365
channel->topic = (topic != NULL && *topic != '\0') ?
366
g_strdup(topic) : NULL;
368
g_free(channel->topic_by);
369
channel->topic_by = g_strdup(nick_name);
371
signal_emit("channel topic changed", 1, channel);
373
if (channel->joined && nick_name != NULL && *nick_name != '\0')
374
signal_emit("message topic", 5, channel->server, channel->name,
375
(channel->topic != NULL) ? channel->topic : "",
376
channel->topic_by, "");
378
char *data = g_strconcat(" ", channel->name, " :",
379
(channel->topic != NULL) ? channel->topic : "", NULL);
380
signal_emit("event 332", 2, channel->server, data);
386
sig_nick_own_event(XMPP_CHANNEL_REC *channel, const char *nick_name,
387
const char *full_jid, const char *affiliation, const char *role,
392
g_return_if_fail(IS_XMPP_CHANNEL(channel));
393
g_return_if_fail(nick_name != NULL);
395
nick = xmpp_nicklist_find(channel, nick_name);
397
signal_emit("xmpp channel nick own_join", 6, channel,
398
nick_name, full_jid, affiliation, role, forced);
400
signal_emit("xmpp channel nick mode", 4, channel, nick,
405
sig_nick_event(XMPP_CHANNEL_REC *channel, const char *nick_name,
406
const char *full_jid, const char *affiliation, const char *role)
410
g_return_if_fail(IS_XMPP_CHANNEL(channel));
411
g_return_if_fail(nick_name != NULL);
413
nick = xmpp_nicklist_find(channel, nick_name);
415
signal_emit("xmpp channel nick join", 5, channel, nick_name,
416
full_jid, affiliation, role);
418
signal_emit("xmpp channel nick mode", 4, channel, nick,
423
sig_nick_own_join(XMPP_CHANNEL_REC *channel, const char *nick_name,
424
const char *full_jid, const char *affiliation, const char *role,
432
nick = xmpp_nicklist_find(channel, nick_name);
436
nick = xmpp_nicklist_insert(channel, nick_name, full_jid);
437
nicklist_set_own(CHANNEL(channel), NICK(nick));
438
channel->chanop = channel->ownnick->op;
439
xmpp_nicklist_set_modes(nick,
440
xmpp_nicklist_get_affiliation(affiliation),
441
xmpp_nicklist_get_role(role));
443
channel->names_got = TRUE;
444
channel->joined = TRUE;
446
signal_emit("message join", 4, channel->server, channel->name,
447
nick->nick, nick->host);
448
signal_emit("message xmpp channel mode", 4, channel,
449
nick->nick, nick->affiliation, nick->role);
451
signal_emit("channel joined", 1, channel);
452
signal_emit("channel sync", 1, channel);
453
channel_send_autocommands(CHANNEL(channel));
456
signal_emit("xmpp channel nick", 3, channel, channel->nick,
459
if (*channel->mode == '\0')
464
sig_nick_join(XMPP_CHANNEL_REC *channel, const char *nick_name,
465
const char *full_jid, const char *affiliation, const char *role)
469
g_return_if_fail(IS_XMPP_CHANNEL(channel));
470
g_return_if_fail(nick_name != NULL);
472
nick = xmpp_nicklist_find(channel, nick_name);
476
nick = xmpp_nicklist_insert(channel, nick_name, full_jid);
477
xmpp_nicklist_set_modes(nick,
478
xmpp_nicklist_get_affiliation(affiliation),
479
xmpp_nicklist_get_role(role));
481
if (channel->names_got) {
482
signal_emit("message join", 4, channel->server, channel->name,
483
nick->nick, nick->host);
484
signal_emit("message xmpp channel mode", 4, channel,
485
nick->nick, nick->affiliation, nick->role);
490
sig_nick_part(XMPP_CHANNEL_REC *channel, const char *nick_name,
495
g_return_if_fail(IS_XMPP_CHANNEL(channel));
496
g_return_if_fail(nick_name != NULL);
498
nick = xmpp_nicklist_find(channel, nick_name);
502
signal_emit("message part", 5, channel->server, channel->name,
503
nick->nick, nick->host, status);
505
if (channel->ownnick == NICK(nick)) {
506
channel->left = TRUE;
507
channel_destroy(CHANNEL(channel));
509
nicklist_remove(CHANNEL(channel), NICK(nick));
513
sig_nick_mode(XMPP_CHANNEL_REC *channel, XMPP_NICK_REC *nick,
514
const char *affiliation_str, const char *role_str)
516
int affiliation, role;
518
g_return_if_fail(IS_XMPP_CHANNEL(channel));
519
g_return_if_fail(IS_XMPP_NICK(nick));
521
affiliation = xmpp_nicklist_get_affiliation(affiliation_str);
522
role = xmpp_nicklist_get_role(role_str);
524
if (xmpp_nicklist_modes_changed(nick, affiliation, role)) {
525
xmpp_nicklist_set_modes(nick, affiliation, role);
527
signal_emit("message xmpp channel mode", 4, channel,
528
nick->nick, affiliation, role);
533
sig_nick_presence(XMPP_CHANNEL_REC *channel, const char *nick_name,
534
const char *show_str, const char *status)
539
g_return_if_fail(IS_XMPP_CHANNEL(channel));
540
g_return_if_fail(nick_name != NULL);
542
nick = xmpp_nicklist_find(channel, nick_name);
546
show = xmpp_presence_get_show(show_str);
547
if (xmpp_presence_changed(show, nick->show, status, nick->status,
549
xmpp_nicklist_set_presence(nick, show, status);
551
if (channel->joined && channel->ownnick != NICK(nick)) {
552
/* TODO show event */
558
sig_nick_changed(XMPP_CHANNEL_REC *channel, const char *oldnick,
563
g_return_if_fail(IS_XMPP_CHANNEL(channel));
564
g_return_if_fail(oldnick != NULL);
565
g_return_if_fail(newnick != NULL);
567
nick = xmpp_nicklist_find(channel, oldnick);
571
xmpp_nicklist_rename(channel, nick, oldnick, newnick);
573
if (channel->ownnick == NICK(nick))
574
signal_emit("message xmpp channel own_nick", 3,
575
channel, nick, oldnick);
577
signal_emit("message xmpp channel nick", 3,
578
channel, nick, oldnick);
583
sig_nick_kicked(XMPP_CHANNEL_REC *channel, const char *nick_name,
584
const char *actor, const char *reason)
588
g_return_if_fail(IS_XMPP_CHANNEL(channel));
589
g_return_if_fail(nick_name != NULL);
591
nick = xmpp_nicklist_find(channel, nick_name);
595
signal_emit("message kick", 6, channel->server, channel->name,
596
nick->nick, (actor != NULL) ? actor : channel->name, nick->host,
599
if (channel->ownnick == NICK(nick)) {
600
channel->kicked = TRUE;
601
channel_destroy(CHANNEL(channel));
603
nicklist_remove(CHANNEL(channel), NICK(nick));
606
static XMPP_CHANNELS_FEATURES
607
disco_parse_channels_features(const char *var, XMPP_CHANNELS_FEATURES features)
609
g_return_val_if_fail(var != NULL, 0);
611
if (!(features & XMPP_CHANNELS_FEATURE_HIDDEN)
612
&& g_ascii_strcasecmp(var, "muc_hidden") == 0)
613
return XMPP_CHANNELS_FEATURE_HIDDEN;
615
if (!(features & XMPP_CHANNELS_FEATURE_MEMBERS_ONLY)
616
&& g_ascii_strcasecmp(var, "muc_membersonly") == 0)
617
return XMPP_CHANNELS_FEATURE_MEMBERS_ONLY;
619
if (!(features & XMPP_CHANNELS_FEATURE_MODERATED)
620
&& g_ascii_strcasecmp(var, "muc_moderated") == 0)
621
return XMPP_CHANNELS_FEATURE_MODERATED;
623
if (!(features & XMPP_CHANNELS_FEATURE_NONANONYMOUS)
624
&& g_ascii_strcasecmp(var, "muc_nonanonymous") == 0)
625
return XMPP_CHANNELS_FEATURE_NONANONYMOUS;
627
if (!(features & XMPP_CHANNELS_FEATURE_OPEN)
628
&& g_ascii_strcasecmp(var, "muc_open") == 0)
629
return XMPP_CHANNELS_FEATURE_OPEN;
631
if (!(features & XMPP_CHANNELS_FEATURE_PASSWORD_PROTECTED)
632
&& g_ascii_strcasecmp(var, "muc_passwordprotected") == 0)
633
return XMPP_CHANNELS_FEATURE_PASSWORD_PROTECTED;
635
if (!(features & XMPP_CHANNELS_FEATURE_PERSISTENT)
636
&& g_ascii_strcasecmp(var, "muc_persistent") == 0)
637
return XMPP_CHANNELS_FEATURE_PERSISTENT;
639
if (!(features & XMPP_CHANNELS_FEATURE_PUBLIC)
640
&& g_ascii_strcasecmp(var, "muc_public") == 0)
641
return XMPP_CHANNELS_FEATURE_PUBLIC;
643
if (!(features & XMPP_CHANNELS_FEATURE_SEMIANONYMOUS)
644
&& g_ascii_strcasecmp(var, "muc_semianonymous") == 0)
645
return XMPP_CHANNELS_FEATURE_SEMIANONYMOUS;
647
if (!(features & XMPP_CHANNELS_FEATURE_TEMPORARY)
648
&& g_ascii_strcasecmp(var, "muc_temporary") == 0)
649
return XMPP_CHANNELS_FEATURE_TEMPORARY;
651
if (!(features & XMPP_CHANNELS_FEATURE_UNMODERATED)
652
&& g_ascii_strcasecmp(var, "muc_unmoderated") == 0)
653
return XMPP_CHANNELS_FEATURE_UNMODERATED;
655
if (!(features & XMPP_CHANNELS_FEATURE_UNSECURED)
656
&& g_ascii_strcasecmp(var, "muc_unsecured") == 0)
657
return XMPP_CHANNELS_FEATURE_UNSECURED;
664
update_channel_modes(XMPP_CHANNEL_REC *channel)
668
g_return_if_fail(IS_XMPP_CHANNEL(channel));
670
modes = g_string_new(NULL);
672
if (channel->features & XMPP_CHANNELS_FEATURE_HIDDEN)
673
g_string_append(modes, "h");
674
if (channel->features & XMPP_CHANNELS_FEATURE_MEMBERS_ONLY)
675
g_string_append(modes, "m");
676
if (channel->features & XMPP_CHANNELS_FEATURE_MODERATED)
677
g_string_append(modes, "M");
678
if (channel->features & XMPP_CHANNELS_FEATURE_NONANONYMOUS)
679
g_string_append(modes, "a");
680
if (channel->features & XMPP_CHANNELS_FEATURE_OPEN)
681
g_string_append(modes, "o");
682
if (channel->features & XMPP_CHANNELS_FEATURE_PASSWORD_PROTECTED)
683
g_string_append(modes, "k");
684
if (channel->features & XMPP_CHANNELS_FEATURE_PERSISTENT)
685
g_string_append(modes, "p");
686
if (channel->features & XMPP_CHANNELS_FEATURE_PUBLIC)
687
g_string_append(modes, "u");
688
if (channel->features & XMPP_CHANNELS_FEATURE_SEMIANONYMOUS)
689
g_string_append(modes, "b");
690
if (channel->features & XMPP_CHANNELS_FEATURE_TEMPORARY)
691
g_string_append(modes, "t");
692
if (channel->features & XMPP_CHANNELS_FEATURE_UNMODERATED)
693
g_string_append(modes, "n");
694
if (channel->features & XMPP_CHANNELS_FEATURE_UNSECURED)
695
g_string_append(modes, "d");
697
if (channel->features & XMPP_CHANNELS_FEATURE_PASSWORD_PROTECTED
698
&& channel->key != NULL)
699
g_string_append_printf(modes, " %s", channel->key);
701
if (strcmp(modes->str, channel->mode) != 0) {
702
g_free(channel->mode);
703
channel->mode = modes->str;
705
signal_emit("channel mode changed", 2, channel, channel->name);
708
g_string_free(modes, FALSE);
712
sig_disco(XMPP_CHANNEL_REC *channel, LmMessageNode *query)
717
g_return_if_fail(IS_XMPP_CHANNEL(channel));
718
g_return_if_fail(query != NULL);
720
channel->features = 0;
721
for (item = query->children; item != NULL; item = item->next) {
722
if (g_ascii_strcasecmp(item->name, "feature") != 0)
725
/* <feature var='var'/> */
726
var = lm_message_node_get_attribute(item, "var");
728
channel->features |= disco_parse_channels_features(var,
731
update_channel_modes(channel);
735
sig_joinerror(XMPP_CHANNEL_REC *channel, int error)
737
g_return_if_fail(IS_XMPP_CHANNEL(channel));
739
/* retry with alternate nick */
740
if (error == XMPP_CHANNELS_ERROR_USE_RESERVED_ROOM_NICK
741
|| error == XMPP_CHANNELS_ERROR_NICK_IN_USE) {
742
const char *altnick = settings_get_str("alternate_nick");
744
if (altnick != NULL && *altnick != '\0'
745
&& strcmp(channel->nick, altnick) != 0) {
746
g_free(channel->nick);
747
channel->nick = g_strdup(altnick);
749
char *str = g_strdup_printf("%s_", channel->nick);
750
g_free(channel->nick);
754
send_join(channel->server, channel);
758
channel_destroy(CHANNEL(channel));
762
sig_channel_created(XMPP_CHANNEL_REC *channel)
764
if (!IS_XMPP_CHANNEL(channel))
767
if (channel->nicks != NULL)
768
g_hash_table_destroy(channel->nicks);
769
channel->nicks = g_hash_table_new((GHashFunc)g_str_hash,
770
(GCompareFunc)g_str_equal);
774
sig_channel_destroyed(XMPP_CHANNEL_REC *channel)
776
if (!IS_XMPP_CHANNEL(channel))
779
if (!channel->server->disconnected && !channel->left)
780
send_part(channel->server, channel,
781
settings_get_str("part_message"));
783
g_free(channel->nick);
787
sig_event_connected(SERVER_REC *server)
790
CHANNEL_SETUP_REC *channel_setup;
792
if (!IS_XMPP_SERVER(server)
793
|| server->connrec->no_autojoin_channels)
796
/* autojoin channels */
797
for (tmp = setupchannels; tmp != NULL; tmp = tmp->next) {
798
channel_setup = tmp->data;
800
if (IS_XMPP_CHANNEL_SETUP(channel_setup)
801
&& channel_setup->autojoin
802
&& strcmp(channel_setup->chatnet,
803
server->connrec->chatnet) == 0)
804
xmpp_channels_join_automatic(XMPP_SERVER(server),
805
channel_setup->name);
810
sig_server_connected(SERVER_REC *server)
812
if (!IS_XMPP_SERVER(server))
815
server->channel_find_func = channel_find_server;
816
server->channels_join = (void (*)(SERVER_REC *, const char *, int))
821
xmpp_channels_init(void)
823
signal_add("xmpp channels part", (SIGNAL_FUNC)sig_part);
824
signal_add("xmpp channels own_nick", (SIGNAL_FUNC)sig_own_nick);
825
signal_add("xmpp channel topic", (SIGNAL_FUNC)sig_topic);
826
signal_add("xmpp channel nick own_event",
827
(SIGNAL_FUNC)sig_nick_own_event);
828
signal_add("xmpp channel nick event", (SIGNAL_FUNC)sig_nick_event);
829
signal_add("xmpp channel nick own_join",
830
(SIGNAL_FUNC)sig_nick_own_join);
831
signal_add("xmpp channel nick join", (SIGNAL_FUNC)sig_nick_join);
832
signal_add("xmpp channel nick part", (SIGNAL_FUNC)sig_nick_part);
833
signal_add("xmpp channel nick mode", (SIGNAL_FUNC)sig_nick_mode);
834
signal_add("xmpp channel nick presence",
835
(SIGNAL_FUNC)sig_nick_presence);
836
signal_add("xmpp channel nick", (SIGNAL_FUNC)sig_nick_changed);
837
signal_add("xmpp channel nick kicked", (SIGNAL_FUNC)sig_nick_kicked);
838
signal_add("xmpp channel disco", (SIGNAL_FUNC)sig_disco);
839
signal_add_last("xmpp channel joinerror", (SIGNAL_FUNC)sig_joinerror);
840
signal_add_last("channel created", (SIGNAL_FUNC)sig_channel_created);
841
signal_add("channel destroyed", (SIGNAL_FUNC)sig_channel_destroyed);
842
signal_add_last("event connected", (SIGNAL_FUNC)sig_event_connected);
843
signal_add_first("server connected",
844
(SIGNAL_FUNC)sig_server_connected);
846
settings_add_int("xmpp_lookandfeel", "xmpp_history_maxstanzas", 30);
850
xmpp_channels_deinit(void)
852
signal_remove("xmpp channels part", (SIGNAL_FUNC)sig_part);
853
signal_remove("xmpp channels own_nick", (SIGNAL_FUNC)sig_own_nick);
854
signal_remove("xmpp channel topic", (SIGNAL_FUNC)sig_topic);
855
signal_remove("xmpp channel nick own_event",
856
(SIGNAL_FUNC)sig_nick_own_event);
857
signal_remove("xmpp channel nick event", (SIGNAL_FUNC)sig_nick_event);
858
signal_remove("xmpp channel nick own_join",
859
(SIGNAL_FUNC)sig_nick_own_join);
860
signal_remove("xmpp channel nick join", (SIGNAL_FUNC)sig_nick_join);
861
signal_remove("xmpp channel nick part", (SIGNAL_FUNC)sig_nick_part);
862
signal_remove("xmpp channel nick mode", (SIGNAL_FUNC)sig_nick_mode);
863
signal_remove("xmpp channel nick presence",
864
(SIGNAL_FUNC)sig_nick_presence);
865
signal_remove("xmpp channel nick", (SIGNAL_FUNC)sig_nick_changed);
866
signal_remove("xmpp channel nick kicked", (SIGNAL_FUNC)sig_nick_kicked);
867
signal_remove("xmpp channel disco", (SIGNAL_FUNC)sig_disco);
868
signal_remove("xmpp channel joinerror", (SIGNAL_FUNC)sig_joinerror);
869
signal_remove("channel created", (SIGNAL_FUNC)sig_channel_created);
870
signal_remove("channel destroyed",(SIGNAL_FUNC)sig_channel_destroyed);
871
signal_remove("event connected", (SIGNAL_FUNC)sig_event_connected);
872
signal_remove("server connected", (SIGNAL_FUNC)sig_server_connected);