Introduction
Introduction Statistics Contact Development Disclaimer Help
ii-1.8-usernames.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
ii-1.8-usernames.diff (6438B)
---
1 diff --git a/ii.c b/ii.c
2 index 6583792..f5ed614 100644
3 --- a/ii.c
4 +++ b/ii.c
5 @@ -33,15 +33,23 @@ size_t strlcpy(char *, const char *, size_t);
6
7 enum { TOK_NICKSRV = 0, TOK_USER, TOK_CMD, TOK_CHAN, TOK_ARG, TOK_TEXT,…
8
9 +typedef struct Nick Nick;
10 +struct Nick {
11 + char name[32];
12 + Nick *next;
13 +};
14 +
15 typedef struct Channel Channel;
16 struct Channel {
17 int fdin;
18 char name[IRC_CHANNEL_MAX]; /* channel name (normalized) */
19 char inpath[PATH_MAX]; /* input path */
20 char outpath[PATH_MAX]; /* output path */
21 + Nick *nicks;
22 Channel *next;
23 };
24
25 +static void add_name(Channel *, const char *);
26 static Channel * channel_add(const char *);
27 static Channel * channel_find(const char *);
28 static Channel * channel_join(const char *);
29 @@ -61,10 +69,14 @@ static void handle_server_output(int);
30 static int isnumeric(const char *);
31 static void loginkey(int, const char *);
32 static void loginuser(int, const char *, const char *);
33 +static void nick_name(const char *, const char *);
34 static void proc_channels_input(int, Channel *, char *);
35 static void proc_channels_privmsg(int, Channel *, char *);
36 +static void proc_names(Channel *, char *);
37 static void proc_server_cmd(int, char *);
38 +static void quit_name(const char *, const char *, const char *);
39 static int read_line(int, char *, size_t);
40 +static int rm_name(Channel *, const char *);
41 static void run(int, const char *);
42 static void setup(void);
43 static void sighandler(int);
44 @@ -236,6 +248,7 @@ channel_new(const char *name)
45 c->next = NULL;
46 strlcpy(c->name, name, sizeof(c->name));
47 channel_normalize_name(c->name);
48 + c->nicks = NULL;
49
50 create_filepath(c->inpath, sizeof(c->inpath), ircpath,
51 channelpath, "in");
52 @@ -294,6 +307,7 @@ static void
53 channel_rm(Channel *c)
54 {
55 Channel *p;
56 + Nick *n, *nn;
57
58 if (channels == c) {
59 channels = channels->next;
60 @@ -303,6 +317,10 @@ channel_rm(Channel *c)
61 if (p && p->next == c)
62 p->next = c->next;
63 }
64 + for (n = c->nicks; n; n = nn) {
65 + nn = n->next;
66 + free(n);
67 + }
68 free(c);
69 }
70
71 @@ -318,6 +336,70 @@ channel_leave(Channel *c)
72 channel_rm(c);
73 }
74
75 +static void
76 +add_name(Channel *c, const char *name) {
77 + Nick *n;
78 + for (n = c->nicks; n; n = n->next)
79 + if (!strcmp(name, n->name)) return;
80 + if (!(n = calloc(1, sizeof(Nick)))) {
81 + fprintf(stderr, "%s: calloc: %s\n", argv0, strerror(err…
82 + exit(1);
83 + }
84 + strlcpy(n->name, name, sizeof(n->name));
85 + n->next = c->nicks;
86 + c->nicks = n;
87 +}
88 +
89 +static int
90 +rm_name(Channel *c, const char *name) {
91 + Nick *n, *pn = NULL;
92 + for (n = c->nicks; n; pn = n, n = n->next) {
93 + if (!strcmp(name, n->name)) {
94 + if (pn)
95 + pn->next = n->next;
96 + else
97 + c->nicks = n->next;
98 + free(n);
99 + return 1;
100 + }
101 + }
102 + return 0;
103 +}
104 +
105 +static void
106 +proc_names(Channel *c, char *names) {
107 + char *p;
108 + if (!(p = strtok(names," "))) return;
109 + do {
110 + if (*p == '@' || *p == '+')
111 + p++;
112 + add_name(c,p);
113 + } while ((p = strtok(NULL," ")));
114 +}
115 +
116 +static void
117 +quit_name(const char *name, const char *user, const char *text) {
118 + Channel *c;
119 + for (c = channels; c; c = c->next) {
120 + if (rm_name(c, name)) {
121 + snprintf(msg, PIPE_BUF, "-!- %s(%s) has quit \"…
122 + channel_print(c, msg);
123 + }
124 + }
125 +}
126 +
127 +static void
128 +nick_name(const char *old, const char *new) {
129 + Channel *c;
130 + for (c = channels; c; c = c->next) {
131 + if (rm_name(c, old)) {
132 + add_name(c, new);
133 + snprintf(msg, PIPE_BUF, "-!- %s changed nick to…
134 + channel_print(c, msg);
135 + }
136 + }
137 +}
138 +
139 static void
140 loginkey(int ircfd, const char *key)
141 {
142 @@ -590,6 +672,15 @@ proc_server_cmd(int fd, char *buf)
143 snprintf(msg, sizeof(msg), "PONG %s\r\n", argv[TOK_TEXT…
144 ewritestr(fd, msg);
145 return;
146 + } else if (!strcmp("353", argv[TOK_CMD])) {
147 + p = strtok(argv[TOK_ARG]," ");
148 + if (!(p = strtok(NULL," ")))
149 + return;
150 + snprintf(msg, PIPE_BUF, "%s%s", argv[TOK_ARG] ? argv[TO…
151 + channel_print(channelmaster, msg);
152 + if ((c = channel_find(p)))
153 + proc_names(c, argv[TOK_TEXT]);
154 + return;
155 } else if (!argv[TOK_NICKSRV] || !argv[TOK_USER]) {
156 /* server command */
157 snprintf(msg, sizeof(msg), "%s%s",
158 @@ -605,9 +696,13 @@ proc_server_cmd(int fd, char *buf)
159 argv[TOK_CHAN] = argv[TOK_TEXT];
160 snprintf(msg, sizeof(msg), "-!- %s(%s) has joined %s",
161 argv[TOK_NICKSRV], argv[TOK_USER], argv…
162 + if ((c = channel_find(argv[TOK_CHAN])))
163 + add_name(c, argv[TOK_NICKSRV]);
164 } else if (!strcmp("PART", argv[TOK_CMD]) && argv[TOK_CHAN]) {
165 snprintf(msg, sizeof(msg), "-!- %s(%s) has left %s",
166 argv[TOK_NICKSRV], argv[TOK_USER], argv…
167 + if ((c = channel_find(argv[TOK_CHAN])))
168 + rm_name(c, argv[TOK_NICKSRV]);
169 /* if user itself leaves, don't write to channel (don't…
170 if (!strcmp(argv[TOK_NICKSRV], nick))
171 return;
172 @@ -618,17 +713,18 @@ proc_server_cmd(int fd, char *buf)
173 argv[TOK_ARG] ? argv[TOK_ARG] : "",
174 argv[TOK_TEXT] ? argv[TOK_TEXT] : "");
175 } else if (!strcmp("QUIT", argv[TOK_CMD])) {
176 - snprintf(msg, sizeof(msg), "-!- %s(%s) has quit \"%s\"",
177 - argv[TOK_NICKSRV], argv[TOK_USER],
178 - argv[TOK_TEXT] ? argv[TOK_TEXT] : "");
179 + quit_name(argv[TOK_NICKSRV], argv[TOK_USER], argv[TOK_T…
180 + return;
181 } else if (!strncmp("NICK", argv[TOK_CMD], 5) && argv[TOK_TEXT]…
182 !strcmp(_nick, argv[TOK_TEXT])) {
183 strlcpy(nick, _nick, sizeof(nick));
184 snprintf(msg, sizeof(msg), "-!- changed nick to \"%s\""…
185 channel_print(channelmaster, msg);
186 + nick_name(argv[TOK_NICKSRV], argv[TOK_TEXT]);
187 + return;
188 } else if (!strcmp("NICK", argv[TOK_CMD]) && argv[TOK_TEXT]) {
189 - snprintf(msg, sizeof(msg), "-!- %s changed nick to %s",
190 - argv[TOK_NICKSRV], argv[TOK_TEXT]);
191 + nick_name(argv[TOK_NICKSRV], argv[TOK_TEXT]);
192 + return;
193 } else if (!strcmp("TOPIC", argv[TOK_CMD])) {
194 snprintf(msg, sizeof(msg), "-!- %s changed topic to \"%…
195 argv[TOK_NICKSRV],
196 @@ -637,6 +733,8 @@ proc_server_cmd(int fd, char *buf)
197 snprintf(msg, sizeof(msg), "-!- %s kicked %s (\"%s\")",
198 argv[TOK_NICKSRV], argv[TOK_ARG],
199 argv[TOK_TEXT] ? argv[TOK_TEXT] : "");
200 + if ((c = channel_find(argv[TOK_CHAN])))
201 + rm_name(c, argv[TOK_ARG]);
202 } else if (!strcmp("NOTICE", argv[TOK_CMD])) {
203 snprintf(msg, sizeof(msg), "-!- \"%s\")",
204 argv[TOK_TEXT] ? argv[TOK_TEXT] : "");
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.