ii-1.4-usernames.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
ii-1.4-usernames.diff (5512B) | |
--- | |
1 diff -r d93eaacde742 ii.c | |
2 --- a/ii.c Fri Jun 25 10:55:05 2010 +0200 | |
3 +++ b/ii.c Tue Jul 27 17:48:23 2010 -0500 | |
4 @@ -26,10 +26,17 @@ | |
5 | |
6 enum { TOK_NICKSRV = 0, TOK_USER, TOK_CMD, TOK_CHAN, TOK_ARG, TOK_TEXT,… | |
7 | |
8 +typedef struct Nick Nick; | |
9 +struct Nick { | |
10 + char *name; | |
11 + Nick *next; | |
12 +}; | |
13 + | |
14 typedef struct Channel Channel; | |
15 struct Channel { | |
16 int fd; | |
17 char *name; | |
18 + Nick *nicks; | |
19 Channel *next; | |
20 }; | |
21 | |
22 @@ -128,18 +135,25 @@ | |
23 c->next = channels; | |
24 channels = c; | |
25 } | |
26 + c->nicks = NULL; | |
27 c->fd = fd; | |
28 c->name = strdup(name); | |
29 } | |
30 | |
31 static void rm_channel(Channel *c) { | |
32 Channel *p; | |
33 + Nick *n, *nn; | |
34 if(channels == c) channels = channels->next; | |
35 else { | |
36 for(p = channels; p && p->next != c; p = p->next); | |
37 if(p->next == c) | |
38 p->next = c->next; | |
39 } | |
40 + for(n = c->nicks; n; n = nn) { | |
41 + nn = n->next; | |
42 + free(n->name); | |
43 + free(n); | |
44 + } | |
45 free(c->name); | |
46 free(c); | |
47 } | |
48 @@ -217,6 +231,76 @@ | |
49 fclose(out); | |
50 } | |
51 | |
52 +static Channel *lookup_chan(const char *name) { | |
53 + Channel *c; | |
54 + for(c = channels; c; c = c->next) | |
55 + if(!strcmp(name, c->name)) | |
56 + return c; | |
57 + return NULL; | |
58 +} | |
59 + | |
60 +static void add_name(const char *chan, const char *name) { | |
61 + Channel *c; | |
62 + Nick *n; | |
63 + if(!(c = lookup_chan(chan))) return; | |
64 + for(n = c->nicks; n; n = n->next) | |
65 + if(!strcmp(name, n->name)) return; | |
66 + if(!(n = malloc(sizeof(Nick)))) { | |
67 + perror("ii: cannot allocate memory"); | |
68 + exit(EXIT_FAILURE); | |
69 + } | |
70 + n->name = strdup(name); | |
71 + n->next = c->nicks; | |
72 + c->nicks = n; | |
73 +} | |
74 + | |
75 +static int rm_name(const char *chan, const char *name) { | |
76 + Channel *c; | |
77 + Nick *n, *pn = NULL; | |
78 + if(!(c = lookup_chan(chan))) return 0; | |
79 + for(n = c->nicks; n; pn = n, n = n->next) { | |
80 + if(!strcmp(name, n->name)) { | |
81 + if(pn) pn->next = n->next; | |
82 + else c->nicks = n->next; | |
83 + free(n->name); | |
84 + free(n); | |
85 + return 1; | |
86 + } | |
87 + } | |
88 + return 0; | |
89 +} | |
90 + | |
91 +static void proc_names(const char *chan, char *names) { | |
92 + char *p; | |
93 + if(!(p = strtok(names," "))) return; | |
94 + do { | |
95 + if(*p == '@' || *p == '+') | |
96 + p++; | |
97 + add_name(chan,p); | |
98 + } while((p = strtok(NULL," "))); | |
99 +} | |
100 + | |
101 +static void quit_name(const char *name, const char *user, const char *t… | |
102 + Channel *c; | |
103 + for(c = channels; c; c = c->next) { | |
104 + if(c->name && rm_name(c->name, name)) { | |
105 + snprintf(message, PIPE_BUF, "-!- %s(%s) has qui… | |
106 + print_out(c->name, message); | |
107 + } | |
108 + } | |
109 +} | |
110 + | |
111 +static void nick_name(const char *old, const char *new) { | |
112 + Channel *c; | |
113 + for(c = channels; c; c = c->next) { | |
114 + if(c->name && rm_name(c->name, old)) { | |
115 + add_name(c->name, new); | |
116 + snprintf(message, PIPE_BUF, "-!- %s changed nic… | |
117 + print_out(c->name, message); | |
118 + } | |
119 + } | |
120 +} | |
121 + | |
122 static void proc_channels_privmsg(char *channel, char *buf) { | |
123 snprintf(message, PIPE_BUF, "<%s> %s", nick, buf); | |
124 print_out(channel, message); | |
125 @@ -342,6 +426,14 @@ | |
126 snprintf(message, PIPE_BUF, "PONG %s\r\n", argv[TOK_TEX… | |
127 write(irc, message, strlen(message)); | |
128 return; | |
129 + } else if(!strncmp("353", argv[TOK_CMD], 4)) { | |
130 + p = strtok(argv[TOK_ARG]," "); | |
131 + if(!(p = strtok(NULL," "))) | |
132 + return; | |
133 + snprintf(message, PIPE_BUF, "%s%s", argv[TOK_ARG] ? arg… | |
134 + print_out(0, message); | |
135 + proc_names(p, argv[TOK_TEXT]); | |
136 + return; | |
137 } else if(!argv[TOK_NICKSRV] || !argv[TOK_USER]) { /* se… | |
138 snprintf(message, PIPE_BUF, "%s%s", argv[TOK_ARG] ? arg… | |
139 print_out(0, message); | |
140 @@ -356,19 +448,24 @@ | |
141 } | |
142 argv[TOK_CHAN] = argv[TOK_TEXT]; | |
143 snprintf(message, PIPE_BUF, "-!- %s(%s) has joined %s",… | |
144 + add_name(argv[TOK_CHAN],argv[TOK_NICKSRV]); | |
145 } else if(!strncmp("PART", argv[TOK_CMD], 5)) { | |
146 snprintf(message, PIPE_BUF, "-!- %s(%s) has left %s", a… | |
147 + rm_name(argv[TOK_CHAN],argv[TOK_NICKSRV]); | |
148 } else if(!strncmp("MODE", argv[TOK_CMD], 5)) | |
149 snprintf(message, PIPE_BUF, "-!- %s changed mode/%s -> … | |
150 - else if(!strncmp("QUIT", argv[TOK_CMD], 5)) | |
151 - snprintf(message, PIPE_BUF, "-!- %s(%s) has quit \"%s\"… | |
152 - else if(!strncmp("NICK", argv[TOK_CMD], 5)) | |
153 - snprintf(message, PIPE_BUF, "-!- %s changed nick to %s"… | |
154 - else if(!strncmp("TOPIC", argv[TOK_CMD], 6)) | |
155 + else if(!strncmp("QUIT", argv[TOK_CMD], 5)) { | |
156 + quit_name(argv[TOK_NICKSRV], argv[TOK_USER], argv[TOK_T… | |
157 + return; | |
158 + } else if(!strncmp("NICK", argv[TOK_CMD], 5)) { | |
159 + nick_name(argv[TOK_NICKSRV], argv[TOK_TEXT]); | |
160 + return; | |
161 + } else if(!strncmp("TOPIC", argv[TOK_CMD], 6)) | |
162 snprintf(message, PIPE_BUF, "-!- %s changed topic to \"… | |
163 - else if(!strncmp("KICK", argv[TOK_CMD], 5)) | |
164 + else if(!strncmp("KICK", argv[TOK_CMD], 5)) { | |
165 snprintf(message, PIPE_BUF, "-!- %s kicked %s (\"%s\")"… | |
166 - else if(!strncmp("NOTICE", argv[TOK_CMD], 7)) | |
167 + rm_name(argv[TOK_CHAN],argv[TOK_NICKSRV]); | |
168 + } else if(!strncmp("NOTICE", argv[TOK_CMD], 7)) | |
169 snprintf(message, PIPE_BUF, "-!- \"%s\")", argv[TOK_TEX… | |
170 else if(!strncmp("PRIVMSG", argv[TOK_CMD], 8)) | |
171 snprintf(message, PIPE_BUF, "<%s> %s", argv[TOK_NICKSRV… |