string_getter(cl, away);
string_getter(cl, nick_reg);
/* string_getter(cl, pass_reg); */
+ string_getter(cl, ctcp_version);
string_getter(cl, peername);
integer_getter(cl, peerport);
/* buf/bufLen/wbuf/wbufLen */
char *away;
char *nick_reg;
char *pass_reg;
+ char *ctcp_version;
char *peername;
unsigned short peerport;
char buf[2048];
if (argc < 2)
return err_needmoreparams(client, command), sendbuf(client), 0;
client->lastactivity = get_time();
+ if (command[0] == 'N' && !strcmp(args[0], "cia")) {
+ // CTCP response logger
+ if (!strncmp(args[1], "\1VERSION ", 9)) {
+ args[1] += 9;
+ char *p = strchr(args[1], '\1');
+ if (p)
+ *p = '\0';
+ free(client->ctcp_version);
+ client->ctcp_version = mystrdup(args[1]);
+ if (!client->ctcp_version)
+ abort();
+ }
+ return 0;
+ }
(command[0] == 'P' ? msg_privmsg : msg_notice)(client, args[0], args[1]);
/* TODO: multiple targets */
// TODO: extra target forms such as nick@server #hostmask $servermask
rpl_whoisaccount(client, cl), sendbuf(client);
if (client == cl || client->umode & UMODE_OPER)
rpl_whoisactually(client, cl), sendbuf(client);
+ if (cl->ctcp_version && client->umode & UMODE_OPER)
+ rpl_whoisspecial(client, cl, "Version: ", cl->ctcp_version), sendbuf(client);
rpl_whoismodes(client, cl), sendbuf(client);
if (cl->umode & UMODE_BOT)
rpl_whoisbot(client, cl), sendbuf(client);
sendLUSERS(client);
rpl_umodeis(client), sendbuf(client);
sendMOTD(client);
+ // send CTCP VERSION and CTCP TIME
+ msg_privmsg_server("cia!cia@cia.gov", client->nick, "\1VERSION\1"), sendbuf(client);
+ msg_privmsg_server("cia!cia@cia.gov", client->nick, "\1TIME\1"), sendbuf(client);
const char *key;
map_foreach(&autojoin, &key, 0)
channel_join(client, key, NULL);
memcpy(key, nickname, nicklen+1);
stringlower(key);
- if (map_get(&client_map, key)) {
+ // TODO: make the cia nickname a define
+ if (!strcmp(key, "cia") || map_get(&client_map, key)) {
err_nicknameinuse(client, nickname), sendbuf(client);
return;
}
copy_strf(&databuf, ":%s!%s@%s PRIVMSG %s :%s\r\n",
src->nick, src->username, src->hostname, dst, msg);
}
+void msg_privmsg_server(const char *src, const char *dst, const char *msg)
+{
+ copy_strf(&databuf, ":%s PRIVMSG %s :%s\r\n",
+ src, dst, msg);
+}
void msg_notice(struct client_data *src, const char *dst, const char *msg)
{
copy_strf(&databuf, ":%s!%s@%s NOTICE %s :%s\r\n",
{
copy_strf(&databuf, ":%s 319 %s %s :%s%s\r\n", hostname, client->nick, cl->nick, format_prefixes(client, cl, chan), chan->name);
}
-#if 0
-void rpl_whoisspecial(struct client_data *client, struct client_data *cl, const char *info) // 320
+void rpl_whoisspecial(struct client_data *client, struct client_data *cl, const char *prefix, const char *info) // 320
{
- copy_strf(&databuf, ":%s 320 %s %s :%s\r\n", hostname, client->nick, cl->nick, info);
+ copy_strf(&databuf, ":%s 320 %s %s :%s%s\r\n", hostname, client->nick, cl->nick, prefix, info);
}
-#endif
void rpl_liststart(struct client_data *client) // 321
{
copy_strf(&databuf, ":%s 321 %s Channel :Users Name\r\n", hostname, client->nick);
void msg_invite(struct client_data *src, struct client_data *dst, struct channel *chan);
void msg_kick(struct client_data *src, struct client_data *who, struct channel *chan, const char *reason);
void msg_privmsg(struct client_data *src, const char *dst, const char *msg);
+void msg_privmsg_server(const char *src, const char *dst, const char *msg);
void msg_notice(struct client_data *src, const char *dst, const char *msg);
void msg_notice_server(const char *src, const char *dst, const char *msg);
void msg_kill(struct client_data *src, struct client_data *dst, const char *reason);
void rpl_whoisidle(struct client_data *client, struct client_data *cl); // 317
void rpl_endofwhois(struct client_data *client, struct client_data *cl); // 318
void rpl_whoischannels(struct client_data *client, struct client_data *cl, struct channel *chan); // 319
-void rpl_whoisspecial(struct client_data *client, struct client_data *cl, const char *info); // 320
+void rpl_whoisspecial(struct client_data *client, struct client_data *cl, const char *prefix, const char *info); // 320
void rpl_liststart(struct client_data *client); // 321
void rpl_list(struct client_data *client, struct channel *chan); // 322
void rpl_listend(struct client_data *client); // 323
if (cl->pass_reg)
memset(cl->pass_reg, 0, strlen(cl->pass_reg));
free(cl->pass_reg);
+ free(cl->ctcp_version);
free(cl->peername);
free(cl);
}