📄 nullprpl.c
字号:
purple_debug_info("nullprpl", "removing %s from %s's buddy list\n", buddy->name, gc->account->username);}static void nullprpl_remove_buddies(PurpleConnection *gc, GList *buddies, GList *groups) { GList *buddy = buddies; GList *group = groups; purple_debug_info("nullprpl", "removing multiple buddies\n"); while (buddy && group) { nullprpl_remove_buddy(gc, (PurpleBuddy *)buddy->data, (PurpleGroup *)group->data); buddy = g_list_next(buddy); group = g_list_next(group); }}/* * nullprpl uses purple's local whitelist and blacklist, stored in blist.xml, as * its authoritative privacy settings, and uses purple's logic (specifically * purple_privacy_check(), from privacy.h), to determine whether messages are * allowed or blocked. */static void nullprpl_add_permit(PurpleConnection *gc, const char *name) { purple_debug_info("nullprpl", "%s adds %s to their allowed list\n", gc->account->username, name);}static void nullprpl_add_deny(PurpleConnection *gc, const char *name) { purple_debug_info("nullprpl", "%s adds %s to their blocked list\n", gc->account->username, name);}static void nullprpl_rem_permit(PurpleConnection *gc, const char *name) { purple_debug_info("nullprpl", "%s removes %s from their allowed list\n", gc->account->username, name);}static void nullprpl_rem_deny(PurpleConnection *gc, const char *name) { purple_debug_info("nullprpl", "%s removes %s from their blocked list\n", gc->account->username, name);}static void nullprpl_set_permit_deny(PurpleConnection *gc) { /* this is for synchronizing the local black/whitelist with the server. * for nullprpl, it's a noop. */}static void joined_chat(PurpleConvChat *from, PurpleConvChat *to, int id, const char *room, gpointer userdata) { /* tell their chat window that we joined */ purple_debug_info("nullprpl", "%s sees that %s joined chat room %s\n", to->nick, from->nick, room); purple_conv_chat_add_user(to, from->nick, NULL, /* user-provided join message, IRC style */ PURPLE_CBFLAGS_NONE, TRUE); /* show a join message */ if (from != to) { /* add them to our chat window */ purple_debug_info("nullprpl", "%s sees that %s is in chat room %s\n", from->nick, to->nick, room); purple_conv_chat_add_user(from, to->nick, NULL, /* user-provided join message, IRC style */ PURPLE_CBFLAGS_NONE, FALSE); /* show a join message */ }}static void nullprpl_join_chat(PurpleConnection *gc, GHashTable *components) { char *username = gc->account->username; char *room = g_hash_table_lookup(components, "room"); int chat_id = g_str_hash(room); purple_debug_info("nullprpl", "%s is joining chat room %s\n", username, room); if (!purple_find_chat(gc, chat_id)) { serv_got_joined_chat(gc, chat_id, room); /* tell everyone that we joined, and add them if they're already there */ foreach_gc_in_chat(joined_chat, gc, chat_id, NULL); } else { purple_debug_info("nullprpl", "%s is already in chat room %s\n", username, room); purple_notify_info(gc, _("Join chat"), _("Join chat"), g_strdup_printf("%s is already in chat room %s.", username, room)); }}static void nullprpl_reject_chat(PurpleConnection *gc, GHashTable *components) { char *invited_by = g_hash_table_lookup(components, "invited_by"); char *room = g_hash_table_lookup(components, "room"); char *username = gc->account->username; PurpleConnection *invited_by_gc = get_nullprpl_gc(invited_by); char *message = g_strdup_printf( "%s %s %s.", username, _("has rejected your invitation to join the chat room"), room); purple_debug_info("nullprpl", "%s has rejected %s's invitation to join chat room %s\n", username, invited_by, room); purple_notify_info(invited_by_gc, _("Chat invitation rejected"), _("Chat invitation rejected"), message);}static char *nullprpl_get_chat_name(GHashTable *components) { char *room = g_hash_table_lookup(components, "room"); purple_debug_info("nullprpl", "reporting chat room name '%s'\n", room); return room;}static void nullprpl_chat_invite(PurpleConnection *gc, int id, const char *message, const char *who) { char *username = gc->account->username; PurpleConversation *conv = purple_find_chat(gc, id); char *room = conv->name; PurpleAccount *to_acct = purple_accounts_find(who, NULLPRPL_ID); purple_debug_info("nullprpl", "%s is inviting %s to join chat room %s\n", username, who, room); if (to_acct) { PurpleConversation *to_conv = purple_find_chat(to_acct->gc, id); if (to_conv) { purple_debug_info("nullprpl", "%s is already in chat room %s; " "ignoring invitation from %s\n", who, room, username); purple_notify_info(gc, _("Chat invitation"), _("Chat invitation"), g_strdup_printf("%s is already in chat room %s.", who, room)); } else { GHashTable *components; components = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free); g_hash_table_replace(components, "room", g_strdup(room)); g_hash_table_replace(components, "invited_by", g_strdup(username)); serv_got_chat_invite(to_acct->gc, room, username, message, components); } }}static void left_chat_room(PurpleConvChat *from, PurpleConvChat *to, int id, const char *room, gpointer userdata) { if (from != to) { /* tell their chat window that we left */ purple_debug_info("nullprpl", "%s sees that %s left chat room %s\n", to->nick, from->nick, room); purple_conv_chat_remove_user(to, from->nick, NULL); /* user-provided message, IRC style */ }}static void nullprpl_chat_leave(PurpleConnection *gc, int id) { PurpleConversation *conv = purple_find_chat(gc, id); purple_debug_info("nullprpl", "%s is leaving chat room %s\n", gc->account->username, conv->name); /* tell everyone that we left */ foreach_gc_in_chat(left_chat_room, gc, id, NULL);}static PurpleCmdRet send_whisper(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *userdata) { const char *to_username; const char *message; const char *from_username; PurpleConvChat *chat; PurpleConvChatBuddy *chat_buddy; PurpleConnection *to; /* parse args */ to_username = args[0]; message = args[1]; if (!to_username || strlen(to_username) == 0) { *error = g_strdup(_("Whisper is missing recipient.")); return PURPLE_CMD_RET_FAILED; } else if (!message || strlen(message) == 0) { *error = g_strdup(_("Whisper is missing message.")); return PURPLE_CMD_RET_FAILED; } from_username = conv->account->username; purple_debug_info("nullprpl", "%s whispers to %s in chat room %s: %s\n", from_username, to_username, conv->name, message); chat = purple_conversation_get_chat_data(conv); chat_buddy = purple_conv_chat_cb_find(chat, to_username); to = get_nullprpl_gc(to_username); if (!chat_buddy) { /* this will be freed by the caller */ *error = g_strdup_printf(_("%s is not logged in."), to_username); return PURPLE_CMD_RET_FAILED; } else if (!to) { *error = g_strdup_printf(_("%s is not in this chat room."), to_username); return PURPLE_CMD_RET_FAILED; } else { /* write the whisper in the sender's chat window */ char *message_to = g_strdup_printf("%s (to %s)", message, to_username); purple_conv_chat_write(chat, from_username, message_to, PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_WHISPER, time(NULL)); g_free(message_to); /* send the whisper */ serv_chat_whisper(to, chat->id, from_username, message); return PURPLE_CMD_RET_OK; }}static void nullprpl_chat_whisper(PurpleConnection *gc, int id, const char *who, const char *message) { char *username = gc->account->username; PurpleConversation *conv = purple_find_chat(gc, id); purple_debug_info("nullprpl", "%s receives whisper from %s in chat room %s: %s\n", username, who, conv->name, message); /* receive whisper on recipient's account */ serv_got_chat_in(gc, id, who, PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_WHISPER, message, time(NULL));}static void receive_chat_message(PurpleConvChat *from, PurpleConvChat *to, int id, const char *room, gpointer userdata) { const char *message = (const char *)userdata; PurpleConnection *to_gc = get_nullprpl_gc(to->nick); purple_debug_info("nullprpl", "%s receives message from %s in chat room %s: %s\n", to->nick, from->nick, room, message); serv_got_chat_in(to_gc, id, from->nick, PURPLE_MESSAGE_RECV, message, time(NULL));}static int nullprpl_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) { char *username = gc->account->username; PurpleConversation *conv = purple_find_chat(gc, id); if (conv) { purple_debug_info("nullprpl", "%s is sending message to chat room %s: %s\n", username, conv->name, message); /* send message to everyone in the chat room */ foreach_gc_in_chat(receive_chat_message, gc, id, (gpointer)message); return 0; } else { purple_debug_info("nullprpl", "tried to send message from %s to chat room #%d: %s\n" "but couldn't find chat room", username, id, message); return -1; }}static void nullprpl_register_user(PurpleAccount *acct) { purple_debug_info("nullprpl", "registering account for %s\n", acct->username);}static void nullprpl_get_cb_info(PurpleConnection *gc, int id, const char *who) { PurpleConversation *conv = purple_find_chat(gc, id); purple_debug_info("nullprpl", "retrieving %s's info for %s in chat room %s\n", who, gc->account->username, conv->name); nullprpl_get_info(gc, who);}static void nullprpl_alias_buddy(PurpleConnection *gc, const char *who, const char *alias) { purple_debug_info("nullprpl", "%s sets %'s alias to %s\n", gc->account->username, who, alias);}static void nullprpl_group_buddy(PurpleConnection *gc, const char *who, const char *old_group, const char *new_group) { purple_debug_info("nullprpl", "%s has moved %s from group %s to group %s\n", who, old_group, new_group);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -