# HG changeset patch # User Luke Schierer # Date 1034907190 0 # Node ID 242e52b37a78f23c8ab3e632bf8332089f4ee21a # Parent 9497635473f23f395412ff942acb463b1310ae23 [gaim-migrate @ 3873] "I have fixed the CTCP PING request and realised that the other CTCP funcntions didn't work, so I have fixed that too." -- birme committer: Tailor Script diff -r 9497635473f2 -r 242e52b37a78 src/protocols/irc/irc.c --- a/src/protocols/irc/irc.c Thu Oct 17 23:17:12 2002 +0000 +++ b/src/protocols/irc/irc.c Fri Oct 18 02:13:10 2002 +0000 @@ -64,6 +64,10 @@ static void irc_ctcp_clientinfo(struct gaim_connection *gc, char *who); static void irc_ctcp_userinfo(struct gaim_connection *gc, char *who); static void irc_ctcp_version(struct gaim_connection *gc, char *who); +static void irc_ctcp_ping(struct gaim_connection *gc, char *who); + +static void irc_send_privmsg(struct gaim_connection *gc, char *who, char *what); +static void irc_send_notice(struct gaim_connection *gc, char *who, char *what); struct dcc_chat { @@ -1134,19 +1138,26 @@ { struct irc_data *id = gc->proto_data; char buf[IRC_BUF_LEN]; + char out[IRC_BUF_LEN]; if (!g_strncasecmp(msg, "VERSION", 7)) { - g_snprintf(buf, sizeof(buf), "NOTICE %s :\001VERSION Gaim " VERSION ": The Penguin Pimpin' " - "Multi-protocol Messaging Client: " WEBSITE "\001\r\n", nick); - irc_write(id->fd, buf, strlen(buf)); + g_snprintf(buf, sizeof(buf), "\001VERSION Gaim " VERSION ": The Penguin Pimpin' " + "Multi-protocol Messaging Client: " WEBSITE "\001"); + irc_send_notice (gc, nick, buf); + g_snprintf(out, sizeof(out), ">> CTCP VERSION requested from %s", nick); + do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); } if (!g_strncasecmp(msg, "CLIENTINFO", 10)) { - g_snprintf(buf, sizeof(buf), "NOTICE %s :\001CLIENTINFO USERINFO CLIENTINFO VERSION\001\r\n", nick); - irc_write(id->fd, buf, strlen(buf)); + g_snprintf(buf, sizeof(buf), "\001CLIENTINFO USERINFO CLIENTINFO VERSION\001"); + irc_send_notice (gc, nick, buf); + g_snprintf(out, sizeof(out), ">> CTCP CLIENTINFO requested from %s", nick); + do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); } if (!g_strncasecmp(msg, "USERINFO", 8)) { - g_snprintf(buf, sizeof(buf), "NOTICE %s :\001USERINFO Alias: %s\001\r\n", nick, gc->user->alias); - irc_write(id->fd, buf, strlen(buf)); + g_snprintf(buf, sizeof(buf), "\001USERINFO Alias: %s\001", gc->user->alias); + irc_send_notice (gc, nick, buf); + g_snprintf(out, sizeof(out), ">> CTCP USERINFO requested from %s", nick); + do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); } if (!g_strncasecmp(msg, "ACTION", 6)) { char *po = strchr(msg + 6, 1); @@ -1156,6 +1167,12 @@ handle_privmsg(gc, to, nick, tmp); g_free(tmp); } + if (!g_strncasecmp(msg, "PING", 4)) { + g_snprintf(buf, sizeof(buf), "\001%s\001", msg); + irc_send_notice (gc, nick, buf); + g_snprintf(out, sizeof(out), ">> CTCP PING requested from %s", nick); + do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); + } if (!g_strncasecmp(msg, "DCC CHAT", 8)) { char **chat_args = g_strsplit(msg, " ", 5); char ask[1024]; @@ -1188,8 +1205,8 @@ ift->xfer = transfer_in_add(gc, nick, ift->name, ift->len, 1, NULL); } - - /* XXX should probably write_to_conv or something here */ + + /*write_to_conv(c, out, WFLAG_SYSTEM, NULL, time(NULL), -1);*/ } static gboolean irc_parse(struct gaim_connection *gc, char *buf) @@ -1328,6 +1345,15 @@ g_snprintf(buf, sizeof(buf), "CTCP Answer: %s", word_eol[5]); do_error_dialog(buf, _("CTCP Version"), GAIM_INFO); + } else if (!g_strcasecmp(word[4], ":\001PING")) { + char *p = strrchr(word_eol[5], '\001'); + time_t ping_time; + if (p) + *p = 0; + ping_time = time(NULL) - atol(word_eol[5]); + g_snprintf(buf, sizeof(buf), "CTCP Ping reply from %s; %d seconds", + word[3], ping_time); + do_error_dialog(buf, _("CTCP Ping"), GAIM_INFO); } else { if (*word_eol[4] == ':') word_eol[4]++; if (ex) @@ -1726,8 +1752,9 @@ g_string_free(str, TRUE); return 1; } - g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, what); - irc_write(id->fd, buf, strlen(buf)); + /*g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, what); + irc_write(id->fd, buf, strlen(buf));*/ + irc_send_privmsg (gc, who, what); what[max] = t; what = what + max; } @@ -1737,8 +1764,10 @@ g_string_free(str, TRUE); return 1; } + /* g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, what); - irc_write(id->fd, buf, strlen(buf)); + irc_write(id->fd, buf, strlen(buf));*/ + irc_send_privmsg (gc, who, what); g_string_free(str, TRUE); return 1; } @@ -1752,8 +1781,11 @@ g_free(what); return 1; } + /* g_snprintf(buf, sizeof(buf), "PRIVMSG %s :\001ACTION %s\001\r\n", who, word_eol[2]); - irc_write(id->fd, buf, strlen(buf)); + irc_write(id->fd, buf, strlen(buf));*/ + g_snprintf(buf, sizeof(buf), "\001ACTION %s\001", word_eol[2]); + irc_send_privmsg (gc, who, buf); g_free(what); return 1; } else if (!g_strcasecmp(pdibuf, "INVITE")) { @@ -1800,8 +1832,9 @@ g_free(what); return -EINVAL; } - g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, word_eol[2]); - irc_write(id->fd, buf, strlen(buf)); + /*g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, word_eol[2]); + irc_write(id->fd, buf, strlen(buf));*/ + irc_send_privmsg (gc, who, word_eol[2]); return 1; } else if (!g_strcasecmp(pdibuf, "MSG")) { if (!*word[2]) { @@ -1812,8 +1845,10 @@ g_free(what); return -EINVAL; } + /* g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", word[2], word_eol[3]); - irc_write(id->fd, buf, strlen(buf)); + irc_write(id->fd, buf, strlen(buf));*/ + irc_send_privmsg (gc, word[2], word_eol[3]); } else if (!g_strcasecmp(pdibuf, "KICK")) { if (!*word[2]) { g_free(what); @@ -1888,6 +1923,10 @@ } else if (!g_strcasecmp(word[2], "VERSION")) { if (word[3]) irc_ctcp_version(gc, word[3]); + + } else if (!g_strcasecmp(word[2], "PING")) { + if (word[3]) + irc_ctcp_ping(gc, word[3]); } } else if (!g_strcasecmp(pdibuf, "DCC")) { struct conversation *c = NULL; @@ -1925,7 +1964,8 @@ write_to_conv(c, "CTCP commands:
" "CLIENTINFO
" "USERINFO
" - "VERSION
", + "VERSION
" + "PING
", WFLAG_NOLOG, NULL, time(NULL), -1); } else if (!g_strcasecmp(word[2], "DCC")) { write_to_conv(c, "DCC commands:
" @@ -1937,7 +1977,7 @@ "JOIN PART TOPIC KICK
" "OP DEOP VOICE DEVOICE
" "ME MSG QUOTE SAY QUIT
" - "MODE VERSION W WHOWAS

" + "MODE VERSION W WHOWAS
" "Type /HELP OPER for operator commands
" "Type /HELP CTCP for CTCP commands
" "Type /HELP DCC for DCC commands", @@ -2261,30 +2301,59 @@ static void irc_ctcp_clientinfo(struct gaim_connection *gc, char *who) { - char buf[200]; + char buf[IRC_BUF_LEN]; + snprintf (buf, sizeof buf, "\001CLIENTINFO\001\n"); - irc_send_im (gc, who, buf, -1, 0); + irc_send_privmsg(gc, who, buf); } static void irc_ctcp_userinfo(struct gaim_connection *gc, char *who) { - char buf[200]; + char buf[IRC_BUF_LEN]; + snprintf (buf, sizeof buf, "\001USERINFO\001\n"); - irc_send_im (gc, who, buf, -1, 0); + irc_send_privmsg(gc, who, buf); } static void irc_ctcp_version(struct gaim_connection *gc, char *who) { - char buf[200]; + char buf[IRC_BUF_LEN]; + snprintf (buf, sizeof buf, "\001VERSION\001\n"); - irc_send_im (gc, who, buf, -1, 0); + irc_send_privmsg(gc, who, buf); +} + +static void irc_ctcp_ping(struct gaim_connection *gc, char *who) +{ + char buf[IRC_BUF_LEN]; + + g_snprintf (buf, sizeof(buf), "\001PING %ul\001\n", time(NULL)); + irc_send_privmsg(gc, who, buf); +} + +static void irc_send_notice(struct gaim_connection *gc, char *who, char *what) +{ + char buf[IRC_BUF_LEN]; + struct irc_data *id = gc->proto_data; + + g_snprintf(buf, sizeof(buf), "NOTICE %s :%s\r\n", who, what); + irc_write(id->fd, buf, strlen(buf)); +} + +static void irc_send_privmsg(struct gaim_connection *gc, char *who, char *what) +{ + char buf[IRC_BUF_LEN]; + struct irc_data *id = gc->proto_data; + + g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, what); + irc_write(id->fd, buf, strlen(buf)); } static void irc_start_chat(struct gaim_connection *gc, char *who) { struct dcc_chat *chat; int len; struct sockaddr_in addr; - char buf[200]; + char buf[IRC_BUF_LEN]; /* Create a socket */ chat = g_new0 (struct dcc_chat, 1); @@ -2368,6 +2437,12 @@ pbm->gc = gc; m = g_list_append(m, pbm); + pbm = g_new0(struct proto_buddy_menu, 1); + pbm->label = _("CTCP Ping"); + pbm->callback = irc_ctcp_ping; + pbm->gc = gc; + m = g_list_append(m, pbm); + return m; }