📄 msgs.c
字号:
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 + -