⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgs.c

📁 irc message protocol stack
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * @file msgs.c *  * gaim * * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu> *  * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "internal.h"#include "conversation.h"#include "blist.h"#include "notify.h"#include "util.h"#include "debug.h"#include "irc.h"#include <stdio.h>static char *irc_mask_nick(const char *mask);static char *irc_mask_userhost(const char *mask);static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]);static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc);static char *irc_mask_nick(const char *mask){	char *end, *buf;	end = strchr(mask, '!');	if (!end)		buf = g_strdup(mask);	else		buf = g_strndup(mask, end - mask);	return buf;}static char *irc_mask_userhost(const char *mask){	return g_strdup(strchr(mask, '!') + 1);}static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]){	char *message = g_strdup_printf("quit: %s", data[1]);	if (gaim_conv_chat_find_user(GAIM_CONV_CHAT(convo), data[0]))		gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), data[0], message);	g_free(message);}void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args){	gaim_debug(GAIM_DEBUG_INFO, "irc", "Unrecognized message: %s\n", args[0]);}void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	if (!args || !args[1])		return;	if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) {		/* We're doing a whois, show this in the whois dialog */		irc_msg_whois(irc, name, from, args);		return;	}	gc = gaim_account_get_connection(irc->account);	if (gc)		serv_got_im(gc, args[1], args[2], GAIM_CONV_IM_AUTO_RESP, time(NULL));}void irc_msg_badmode(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc = gaim_account_get_connection(irc->account);	if (!args || !args[1] || !gc)		return;	gaim_notify_error(gc, NULL, _("Bad mode"), args[1]);}void irc_msg_banned(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc = gaim_account_get_connection(irc->account);	char *buf;	if (!args || !args[1] || !gc)		return;	buf = g_strdup_printf(_("You are banned from %s."), args[1]);	gaim_notify_error(gc, _("Banned"), _("Banned"), buf);	g_free(buf);}void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConversation *convo;	char *buf;	if (!args || !args[1] || !args[2])		return;	convo = gaim_find_conversation_with_account(args[1], irc->account);	if (!convo)	/* XXX punt on channels we are not in for now */		return;	buf = g_strdup_printf("mode for %s: %s %s", args[1], args[2], args[3] ? args[3] : "");	gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));	g_free(buf);	return;}void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args){	if (!irc->whois.nick) {		gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected WHOIS reply for %s\n", args[1]);		return;	}	if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) {		gaim_debug(GAIM_DEBUG_WARNING, "irc", "Got WHOIS reply for %s while waiting for %s\n", args[1], irc->whois.nick);		return;	}	if (!strcmp(name, "301")) {		irc->whois.away = g_strdup(args[2]);	} else if (!strcmp(name, "311")) {		irc->whois.userhost = g_strdup_printf("%s@%s", args[2], args[3]);		irc->whois.name = g_strdup(args[5]);	} else if (!strcmp(name, "312")) {		irc->whois.server = g_strdup(args[2]);		irc->whois.serverinfo = g_strdup(args[3]);	} else if (!strcmp(name, "313")) {		irc->whois.ircop = 1;	} else if (!strcmp(name, "317")) {		irc->whois.idle = atoi(args[2]);		if (args[3])			irc->whois.signon = (time_t)atoi(args[3]);	} else if (!strcmp(name, "319")) {		irc->whois.channels = g_strdup(args[2]);	} else if (!strcmp(name, "320")) {		irc->whois.identified = 1;	}}void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	GString *info;	char buffer[256];	char *str;	if (!irc->whois.nick) {		gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected End of WHOIS for %s\n", args[1]);		return;	}	if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) {		gaim_debug(GAIM_DEBUG_WARNING, "irc", "Received end of WHOIS for %s, expecting %s\n", args[1], irc->whois.nick);		return;	}	info = g_string_new("");	g_string_append_printf(info, _("<b>%s:</b> %s"), _("Nick"), args[1]);	g_string_append_printf(info, "%s%s<br>",			       irc->whois.ircop ? _(" <i>(ircop)</i>") : "",			       irc->whois.identified ? _(" <i>(identified)</i>") : "");	if (irc->whois.away) {		char *tmp = g_markup_escape_text(irc->whois.away, strlen(irc->whois.away));		g_free(irc->whois.away);		g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Away"), tmp);		g_free(tmp);	}	if (irc->whois.userhost) {		char *tmp = g_markup_escape_text(irc->whois.name, strlen(irc->whois.name));		g_free(irc->whois.name);		g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Username"), irc->whois.userhost);		g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Realname"), tmp);		g_free(irc->whois.userhost);		g_free(tmp);	}	if (irc->whois.server) {		g_string_append_printf(info, _("<b>%s:</b> %s"), _("Server"), irc->whois.server);		g_string_append_printf(info, " (%s)<br>", irc->whois.serverinfo);		g_free(irc->whois.server);		g_free(irc->whois.serverinfo);	}	if (irc->whois.channels) {		g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Currently on"), irc->whois.channels);		g_free(irc->whois.channels);	}	if (irc->whois.idle) {		gchar *timex = gaim_str_seconds_to_string(irc->whois.idle);		g_string_append_printf(info, _("<b>Idle for:</b> %s<br>"), timex);		g_free(timex);		g_string_append_printf(info, _("<b>%s:</b> %s"), _("Online since"), ctime(&irc->whois.signon));	}	if (!strcmp(irc->whois.nick, "Paco-Paco")) {		g_string_append_printf(info, _("<br><b>Defining adjective:</b> Glorious<br>"));	}	gc = gaim_account_get_connection(irc->account);	str = g_string_free(info, FALSE);	g_snprintf(buffer, sizeof(buffer),			   _("Buddy Information for %s"), irc->whois.nick);	gaim_notify_userinfo(gc, irc->whois.nick, NULL, buffer, NULL, str, NULL, NULL);	g_free(str);	memset(&irc->whois, 0, sizeof(irc->whois));}void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args){	if (!irc->roomlist)		return;	if (!strcmp(name, "321")) {		gaim_roomlist_set_in_progress(irc->roomlist, TRUE);		return;	}	if (!strcmp(name, "323")) {		gaim_roomlist_set_in_progress(irc->roomlist, FALSE);		gaim_roomlist_unref(irc->roomlist);		irc->roomlist = NULL;	}	if (!strcmp(name, "322")) {		GaimRoomlistRoom *room;		if (!args[0] || !args[1] || !args[2] || !args[3])			return;		room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, args[1], NULL);		gaim_roomlist_room_add_field(irc->roomlist, room, args[1]);		gaim_roomlist_room_add_field(irc->roomlist, room, GINT_TO_POINTER(strtol(args[2], NULL, 10)));		gaim_roomlist_room_add_field(irc->roomlist, room, args[3]);		gaim_roomlist_room_add(irc->roomlist, room);	}}void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args){	char *chan, *topic, *msg, *nick, *tmp, *tmp2;	GaimConversation *convo;	if (!strcmp(name, "topic")) {		chan = args[0];		topic = irc_mirc2txt (args[1]);	} else {		chan = args[1];		topic = irc_mirc2txt (args[2]);	}	convo = gaim_find_conversation_with_account(chan, irc->account);	if (!convo) {		gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a topic for %s, which doesn't exist\n", chan);	}	/* If this is an interactive update, print it out */	tmp = gaim_escape_html(topic);	tmp2 = gaim_markup_linkify(tmp);	g_free(tmp);	if (!strcmp(name, "topic")) {		nick = irc_mask_nick(from);		gaim_conv_chat_set_topic(GAIM_CONV_CHAT(convo), nick, topic);		msg = g_strdup_printf(_("%s has changed the topic to: %s"), nick, tmp2);		g_free(nick);		gaim_conv_chat_write(GAIM_CONV_CHAT(convo), from, msg, GAIM_MESSAGE_SYSTEM, time(NULL));		g_free(msg);	} else {		msg = g_strdup_printf(_("The topic for %s is: %s"), chan, tmp2);		gaim_conv_chat_set_topic(GAIM_CONV_CHAT(convo), NULL, topic);		gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM, time(NULL));		g_free(msg);	}	g_free(tmp2);	g_free(topic);}void irc_msg_unknown(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc = gaim_account_get_connection(irc->account);	char *buf;	if (!args || !args[1] || !gc)		return;	buf = g_strdup_printf(_("Unknown message '%s'"), args[1]);	gaim_notify_error(gc, _("Unknown message"), buf, _("Gaim has sent a message the IRC server did not understand."));	g_free(buf);}void irc_msg_names(struct irc_conn *irc, const char *name, const char *from, char **args){	char *names, *cur, *end, *tmp, *msg;	GaimConversation *convo;	if (!strcmp(name, "366")) {		convo = gaim_find_conversation_with_account(irc->nameconv ? irc->nameconv : args[1], irc->account);		if (!convo) {			gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a NAMES list for %s, which doesn't exist\n", args[2]);			g_string_free(irc->names, TRUE);			irc->names = NULL;			g_free(irc->nameconv);			irc->nameconv = NULL;			return;		}		names = cur = g_string_free(irc->names, FALSE);		irc->names = NULL;		if (irc->nameconv) {			msg = g_strdup_printf(_("Users on %s: %s"), args[1], names);			if (gaim_conversation_get_type(convo) == GAIM_CONV_CHAT)				gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));			else				gaim_conv_im_write(GAIM_CONV_IM(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));			g_free(msg);			g_free(irc->nameconv);			irc->nameconv = NULL;		} else {			GList *users = NULL;			GList *flags = NULL;			while (*cur) {				GaimConvChatBuddyFlags f = GAIM_CBFLAGS_NONE;				end = strchr(cur, ' ');				if (!end)					end = cur + strlen(cur);				if (*cur == '@') {					f = GAIM_CBFLAGS_OP;					cur++;				} else if (*cur == '%') {					f = GAIM_CBFLAGS_HALFOP;					cur++;				} else if(*cur == '+') {					f = GAIM_CBFLAGS_VOICE;					cur++;				}				tmp = g_strndup(cur, end - cur);				users = g_list_append(users, tmp);				flags = g_list_append(flags, GINT_TO_POINTER(f));				cur = end;				if (*cur)					cur++;			}			if (users != NULL) {				GList *l;				gaim_conv_chat_add_users(GAIM_CONV_CHAT(convo), users, flags);				for (l = users; l != NULL; l = l->next)					g_free(l->data);				g_list_free(users);				g_list_free(flags);			}		}		g_free(names);	} else {		if (!irc->names)			irc->names = g_string_new("");		irc->names = g_string_append(irc->names, args[3]);	}}void irc_msg_motd(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	if (!strcmp(name, "375")) {		gc = gaim_account_get_connection(irc->account);		if (gc)			gaim_connection_set_display_name(gc, args[0]);	}	if (!irc->motd)		irc->motd = g_string_new("");	g_string_append_printf(irc->motd, "%s<br>", args[1]);}void irc_msg_endmotd(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	gc = gaim_account_get_connection(irc->account);	if (!gc)		return;	gaim_connection_set_state(gc, GAIM_CONNECTED);	serv_finish_login (gc);	irc_blist_timeout(irc);	if (!irc->timer)		irc->timer = gaim_timeout_add(45000, (GSourceFunc)irc_blist_timeout, (gpointer)irc);}void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc = gaim_account_get_connection(irc->account);	if (gc == NULL || args == NULL || args[1] == NULL)		return;	gaim_notify_error(gc, NULL, _("No such channel"), args[1]);}void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	GaimConversation *convo;	convo = gaim_find_conversation_with_account(args[1], irc->account);	if (convo) {		if (gaim_conversation_get_type(convo) == GAIM_CONV_CHAT) /* does this happen? */			gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], _("no such channel"),					GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));		else			gaim_conv_im_write(GAIM_CONV_IM(convo), args[1], _("User is not logged in"),				      GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));	} else {		if ((gc = gaim_account_get_connection(irc->account)) == NULL)			return;		gaim_notify_error(gc, NULL, _("No such nick or channel"), args[1]);	}	if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) {		g_free(irc->whois.nick);		irc->whois.nick = NULL;	}}void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConnection *gc;	GaimConversation *convo;	convo = gaim_find_conversation_with_account(args[1], irc->account);	if (convo) {		gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));	} else {		if ((gc = gaim_account_get_connection(irc->account)) == NULL)			return;		gaim_notify_error(gc, NULL, _("Could not send"), args[2]);	}}void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args){	GaimConversation *convo = gaim_find_conversation_with_account(args[1], irc->account);	gaim_debug(GAIM_DEBUG_INFO, "irc", "We're apparently not in %s, but tried to use it\n", args[1]);	if (convo) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -