-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsilc-notify.c
201 lines (176 loc) · 7.12 KB
/
silc-notify.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include "silc.h"
#include "silcclient.h"
#include "weechat-plugin.h"
#include "silc-plugin.h"
#include "silc-connections.h"
#include "silc-nicklist.h"
/* prototypes */
void silc_notify_none(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_motd(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_join(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_leave(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_topic(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_signoff(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_cmode(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify_cumode(SilcClient client, SilcClientConnection conn, va_list va);
void silc_notify(SilcClient client, SilcClientConnection conn, SilcNotifyType type, ...) {
va_list va;
va_start(va, type);
switch (type) {
case SILC_NOTIFY_TYPE_NONE:
silc_notify_none(client, conn, va);
break;
case SILC_NOTIFY_TYPE_MOTD:
silc_notify_motd(client, conn, va);
break;
case SILC_NOTIFY_TYPE_JOIN:
silc_notify_join(client, conn, va);
break;
case SILC_NOTIFY_TYPE_LEAVE:
silc_notify_leave(client, conn, va);
break;
case SILC_NOTIFY_TYPE_TOPIC_SET:
silc_notify_topic(client, conn, va);
break;
case SILC_NOTIFY_TYPE_SIGNOFF:
silc_notify_signoff(client, conn, va);
break;
case SILC_NOTIFY_TYPE_CMODE_CHANGE:
silc_notify_cmode(client, conn, va);
break;
case SILC_NOTIFY_TYPE_CUMODE_CHANGE:
silc_notify_cumode(client, conn, va);
break;
case SILC_NOTIFY_TYPE_NICK_CHANGE:
case SILC_NOTIFY_TYPE_CHANNEL_CHANGE:
case SILC_NOTIFY_TYPE_SERVER_SIGNOFF:
case SILC_NOTIFY_TYPE_KICKED:
case SILC_NOTIFY_TYPE_KILLED:
case SILC_NOTIFY_TYPE_ERROR:
case SILC_NOTIFY_TYPE_WATCH:
default:
weechat_log_printf("silc_notify was called with unhandled type %d", type);
break;
}
va_end(va);
}
void silc_notify_none(SilcClient client, SilcClientConnection conn, va_list va) {
struct t_gui_buffer *buffer = NULL;
char *message;
SilcConnectionContext ctx = conn->context;
message = va_arg(va, char *);
if (ctx) {
buffer = ctx->server_buffer;
}
weechat_printf(buffer, "%s%s", weechat_prefix("network"), message);
}
void silc_notify_motd(SilcClient client, SilcClientConnection conn, va_list va) {
struct t_gui_buffer *buffer = NULL;
char *message;
SilcConnectionContext ctx = conn->context;
message = va_arg(va, char *);
if (ctx) {
buffer = ctx->server_buffer;
}
weechat_printf(buffer, "%sMOTD: %s", weechat_prefix("network"), message);
}
void silc_notify_join(SilcClient client, SilcClientConnection conn, va_list va) {
SilcClientEntry joiner;
SilcChannelEntry channel;
joiner = va_arg(va, SilcClientEntry);
channel = va_arg(va, SilcChannelEntry);
silc_nicklist_add(silc_client_on_channel(channel, joiner));
weechat_printf(channel->context, "%s%s has joined channel %s", weechat_prefix("join"), joiner->nickname, channel->channel_name);
}
void silc_notify_leave(SilcClient client, SilcClientConnection conn, va_list va) {
SilcClientEntry quitter;
SilcChannelEntry channel;
quitter = va_arg(va, SilcClientEntry);
channel = va_arg(va, SilcChannelEntry);
silc_nicklist_remove(channel, quitter);
weechat_printf(channel->context, "%s%s has left channel %s", weechat_prefix("quit"), quitter->nickname, channel->channel_name);
}
void silc_notify_signoff(SilcClient client, SilcClientConnection conn, va_list va) {
SilcClientEntry quitter;
SilcChannelEntry channel;
char *message;
quitter = va_arg(va, SilcClientEntry);
message = va_arg(va, char*);
channel = va_arg(va, SilcChannelEntry);
silc_nicklist_remove(channel, quitter);
weechat_printf(channel->context, "%s%s has quit (%s)", weechat_prefix("quit"), quitter->nickname, message);
}
char *silc_util_name_for_type(SilcIdType id_type, void *entry) {
switch (id_type) {
case SILC_ID_CLIENT:
return ((SilcClientEntry) entry)->nickname;
case SILC_ID_SERVER:
return ((SilcServerEntry) entry)->server_name;
case SILC_ID_CHANNEL:
return ((SilcChannelEntry) entry)->channel_name;
default:
return "<unknown>";
}
}
void silc_notify_topic(SilcClient client, SilcClientConnection conn, va_list va) {
SilcIdType id_type;
SilcChannelEntry channel;
char *old_topic;
char *new_topic;
char *setter_name;
void *setter;
id_type = va_arg(va, int);
setter = va_arg(va, void *);
new_topic = va_arg(va, char*);
channel = va_arg(va, SilcChannelEntry);
old_topic = strdup(weechat_buffer_get_string(channel->context, "title"));
setter_name = silc_util_name_for_type(id_type, setter);
weechat_buffer_set(channel->context, "title", channel->topic);
if (old_topic) {
weechat_printf(channel->context, "%s%s has changed topic from \"%s\" to \"%s\"", weechat_prefix("network"), setter_name, old_topic, new_topic);
free(old_topic);
} else {
weechat_printf(channel->context, "%s%s has set topic to \"%s\"", weechat_prefix("network"), setter_name, new_topic);
}
}
void silc_notify_cumode(SilcClient client, SilcClientConnection conn, va_list va) {
SilcIdType id_type;
void *changer;
char *changer_name;
SilcUInt32 mode;
SilcClientEntry target;
SilcChannelEntry channel;
id_type = va_arg(va, int);
changer = va_arg(va, void *);
mode = va_arg(va, SilcUInt32);
target = va_arg(va, SilcClientEntry);
channel = va_arg(va, SilcChannelEntry);
changer_name = silc_util_name_for_type(id_type, changer);
silc_nicklist_update(silc_client_on_channel(channel, target));
weechat_printf(channel->context, "%schannel user mode %s [%s] by %s", weechat_prefix("network"), target->nickname, silc_client_chumode(mode), changer_name);
weechat_bar_item_update("input_prompt");
}
void silc_notify_cmode(SilcClient client, SilcClientConnection conn, va_list va) {
SilcIdType id_type;
void *changer;
char *changer_name;
SilcUInt32 mode;
char *cipher_name;
char *hmac_name;
char *passphrase;
SilcPublicKey founder_key;
SilcDList channel_pubkeys;
SilcChannelEntry channel;
id_type = va_arg(va, int);
changer = va_arg(va, void *);
mode = va_arg(va, SilcUInt32);
cipher_name = va_arg(va, char *);
hmac_name = va_arg(va, char *);
passphrase = va_arg(va, char *);
founder_key = va_arg(va, SilcPublicKey);
channel_pubkeys = va_arg(va, SilcDList);
channel = va_arg(va, SilcChannelEntry);
changer_name = silc_util_name_for_type(id_type, changer);
weechat_printf(channel->context, "%schannel mode [%s] by %s", weechat_prefix("network"), silc_client_chmode(mode, cipher_name, hmac_name), changer_name);
weechat_bar_item_update("buffer_name");
}