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

📄 msgs.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	PurpleConversation *convo;	if (!strcmp(name, "topic")) {		chan = args[0];		topic = irc_mirc2txt (args[1]);	} else {		chan = args[1];		topic = irc_mirc2txt (args[2]);	}	convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chan, irc->account);	if (!convo) {		purple_debug(PURPLE_DEBUG_ERROR, "irc", "Got a topic for %s, which doesn't exist\n", chan);		g_free(topic);		return;	}	/* If this is an interactive update, print it out */	tmp = g_markup_escape_text(topic, -1);	tmp2 = purple_markup_linkify(tmp);	g_free(tmp);	if (!strcmp(name, "topic")) {		const char *current_topic = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(convo));		if (!(current_topic != NULL && strcmp(tmp2, current_topic) == 0))		{			char *nick_esc;			nick = irc_mask_nick(from);			nick_esc = g_markup_escape_text(nick, -1);			purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), nick, topic);			if (*tmp2)				msg = g_strdup_printf(_("%s has changed the topic to: %s"), nick_esc, tmp2);			else				msg = g_strdup_printf(_("%s has cleared the topic."), nick_esc);			g_free(nick_esc);			g_free(nick);			purple_conv_chat_write(PURPLE_CONV_CHAT(convo), from, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));			g_free(msg);		}	} else {		char *chan_esc = g_markup_escape_text(chan, -1);		msg = g_strdup_printf(_("The topic for %s is: %s"), chan_esc, tmp2);		g_free(chan_esc);		purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), NULL, topic);		purple_conv_chat_write(PURPLE_CONV_CHAT(convo), "", msg, PURPLE_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){	PurpleConnection *gc = purple_account_get_connection(irc->account);	char *buf;	if (!args || !args[1] || !gc)		return;	buf = g_strdup_printf(_("Unknown message '%s'"), args[1]);	purple_notify_error(gc, _("Unknown message"), buf, _("The IRC server received a message it 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;	PurpleConversation *convo;	if (!strcmp(name, "366")) {		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, args[1], irc->account);		if (!convo) {			purple_debug(PURPLE_DEBUG_ERROR, "irc", "Got a NAMES list for %s, which doesn't exist\n", args[1]);			g_string_free(irc->names, TRUE);			irc->names = NULL;			return;		}		names = cur = g_string_free(irc->names, FALSE);		irc->names = NULL;		if (purple_conversation_get_data(convo, IRC_NAMES_FLAG)) {			msg = g_strdup_printf(_("Users on %s: %s"), args[1], names ? names : "");			if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_CHAT)				purple_conv_chat_write(PURPLE_CONV_CHAT(convo), "", msg, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));			else				purple_conv_im_write(PURPLE_CONV_IM(convo), "", msg, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));			g_free(msg);		} else {			GList *users = NULL;			GList *flags = NULL;			while (*cur) {				PurpleConvChatBuddyFlags f = PURPLE_CBFLAGS_NONE;				end = strchr(cur, ' ');				if (!end)					end = cur + strlen(cur);				if (*cur == '@') {					f = PURPLE_CBFLAGS_OP;					cur++;				} else if (*cur == '%') {					f = PURPLE_CBFLAGS_HALFOP;					cur++;				} else if(*cur == '+') {					f = PURPLE_CBFLAGS_VOICE;					cur++;				} else if(irc->mode_chars					  && strchr(irc->mode_chars, *cur)) {					cur++;				}				tmp = g_strndup(cur, end - cur);				users = g_list_prepend(users, tmp);				flags = g_list_prepend(flags, GINT_TO_POINTER(f));				cur = end;				if (*cur)					cur++;			}			if (users != NULL) {				GList *l;				purple_conv_chat_add_users(PURPLE_CONV_CHAT(convo), users, NULL, flags, FALSE);				for (l = users; l != NULL; l = l->next)					g_free(l->data);				g_list_free(users);				g_list_free(flags);			}			purple_conversation_set_data(convo, IRC_NAMES_FLAG,						   GINT_TO_POINTER(TRUE));		}		g_free(names);	} else {		if (!irc->names)			irc->names = g_string_new("");		if (irc->names->len && irc->names->str[irc->names->len - 1] != ' ')			irc->names = g_string_append_c(irc->names, ' ');		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){	char *escaped;	if (!args || !args[0])		return;	if (!irc->motd)		irc->motd = g_string_new("");	if (!strcmp(name, "375")) {		if (irc->motd)			g_string_free(irc->motd, TRUE);		irc->motd = g_string_new("");		return;	} else if (!strcmp(name, "376")) {		/* dircproxy 1.0.5 does not send 251 on reconnection, so		 * finalize the connection here if it is not already done. */		irc_connected(irc, args[0]);		return;	}	if (!irc->motd) {		purple_debug_error("irc", "IRC server sent MOTD without STARTMOTD\n");		return;	}	if (!args[1])		return;	escaped = g_markup_escape_text(args[1], -1);	g_string_append_printf(irc->motd, "%s<br>", escaped);	g_free(escaped);}void irc_msg_time(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConnection *gc;	gc = purple_account_get_connection(irc->account);	if (gc == NULL || args == NULL || args[2] == NULL)		return;	purple_notify_message(gc, PURPLE_NOTIFY_MSG_INFO, _("Time Response"),			    _("The IRC server's local time is:"),			    args[2], NULL, NULL);}void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConnection *gc = purple_account_get_connection(irc->account);	if (gc == NULL || args == NULL || args[1] == NULL)		return;	purple_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){	PurpleConnection *gc;	PurpleConversation *convo;	convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, args[1], irc->account);	if (convo) {		if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_CHAT) /* does this happen? */			purple_conv_chat_write(PURPLE_CONV_CHAT(convo), args[1], _("no such channel"),					PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));		else			purple_conv_im_write(PURPLE_CONV_IM(convo), args[1], _("User is not logged in"),				      PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));	} else {		if ((gc = purple_account_get_connection(irc->account)) == NULL)			return;		purple_notify_error(gc, NULL, _("No such nick or channel"), args[1]);	}	if (irc->whois.nick && !purple_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){	PurpleConnection *gc;	PurpleConversation *convo;	convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account);	if (convo) {		purple_conv_chat_write(PURPLE_CONV_CHAT(convo), args[1], args[2], PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));	} else {		if ((gc = purple_account_get_connection(irc->account)) == NULL)			return;		purple_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){	PurpleConversation *convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account);	purple_debug(PURPLE_DEBUG_INFO, "irc", "We're apparently not in %s, but tried to use it\n", args[1]);	if (convo) {		/*g_slist_remove(irc->gc->buddy_chats, convo);		  purple_conversation_set_account(convo, NULL);*/		purple_conv_chat_write(PURPLE_CONV_CHAT(convo), args[1], args[2], PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL));	}}void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConversation *convo;	if (!args || !args[1] || !args[2])		return;	convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[1], irc->account);	if (!convo)		return;	purple_conv_chat_write(PURPLE_CONV_CHAT(convo), "", args[2], PURPLE_MESSAGE_SYSTEM, time(NULL));}void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConnection *gc = purple_account_get_connection(irc->account);	GHashTable *components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);	char *nick = irc_mask_nick(from);	if (!args || !args[1] || !gc) {		g_free(nick);		g_hash_table_destroy(components);		return;	}	g_hash_table_insert(components, strdup("channel"), strdup(args[1]));	serv_got_chat_invite(gc, args[1], nick, NULL, components);	g_free(nick);}void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConnection *gc = purple_account_get_connection(irc->account);	char *buf;	if (!args || !args[1] || !gc)		return;	buf = g_strdup_printf(_("Joining %s requires an invitation."), args[1]);	purple_notify_error(gc, _("Invitation only"), _("Invitation only"), buf);	g_free(buf);}void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args){	char **nicks;	struct irc_buddy *ib;	int i;	if (!args || !args[1])		return;	nicks = g_strsplit(args[1], " ", -1);	for (i = 0; nicks[i]; i++) {		if ((ib = g_hash_table_lookup(irc->buddies, (gconstpointer)nicks[i])) == NULL) {			continue;		}		ib->flag = TRUE;	}	g_strfreev(nicks);	g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc);}static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc){	PurpleConnection *gc = purple_account_get_connection(irc->account);	PurpleBuddy *buddy = purple_find_buddy(irc->account, name);	if (!gc || !buddy)		return;	if (ib->online && !ib->flag) {		purple_prpl_got_user_status(irc->account, name, "offline", NULL);		ib->online = FALSE;	} else if (!ib->online && ib->flag) {		purple_prpl_got_user_status(irc->account, name, "available", NULL);		ib->online = TRUE;	}}void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args){	PurpleConnection *gc = purple_account_get_connection(irc->account);	PurpleConversation *convo;	char *nick = irc_mask_nick(from), *userhost;	struct irc_buddy *ib;	static int id = 1;	if (!gc) {		g_free(nick);		return;	}	if (!purple_utf8_strcasecmp(nick, purple_connection_get_display_name(gc))) {		/* We are joining a channel for the first time */		serv_got_joined_chat(gc, id++, args[0]);		g_free(nick);		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,							    args[0],							    irc->account);		if (convo == NULL) {			purple_debug_error("irc", "tried to join %s but couldn't\n", args[0]);			return;		}		purple_conversation_set_data(convo, IRC_NAMES_FLAG,					   GINT_TO_POINTER(FALSE));		purple_conversation_present(convo);		return;	}	convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[0], irc->account);	if (convo == NULL) {		purple_debug(PURPLE_DEBUG_ERROR, "irc", "JOIN for %s failed\n", args[0]);		g_free(nick);		return;	}	userhost = irc_mask_userhost(from);	purple_conv_chat_add_user(PURPLE_CONV_CHAT(convo), nick, userhost, PURPLE_CBFLAGS_NONE, TRUE);	if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) {		ib->flag = TRUE;		irc_buddy_status(nick, ib, irc);	}	g_free(userhost);	g_free(nick);}void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args){

⌨️ 快捷键说明

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