📄 nullprpl.c
字号:
static void nullprpl_rename_group(PurpleConnection *gc, const char *old_name, PurpleGroup *group, GList *moved_buddies) { purple_debug_info("nullprpl", "%s has renamed group %s to %s\n", gc->account->username, old_name, group->name);}static void nullprpl_convo_closed(PurpleConnection *gc, const char *who) { purple_debug_info("nullprpl", "%s's conversation with %s was closed\n", gc->account->username, who);}/* normalize a username (e.g. remove whitespace, add default domain, etc.) * for nullprpl, this is a noop. */static const char *nullprpl_normalize(const PurpleAccount *acct, const char *input) { return NULL;}static void nullprpl_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) { purple_debug_info("nullprpl", "setting %s's buddy icon to %s\n", gc->account->username, purple_imgstore_get_filename(img));}static void nullprpl_remove_group(PurpleConnection *gc, PurpleGroup *group) { purple_debug_info("nullprpl", "%s has removed group %s\n", gc->account->username, group->name);}static void set_chat_topic_fn(PurpleConvChat *from, PurpleConvChat *to, int id, const char *room, gpointer userdata) { const char *topic = (const char *)userdata; const char *username = from->conv->account->username; char *msg; purple_conv_chat_set_topic(to, username, topic); if (topic && strlen(topic) > 0) msg = g_strdup_printf(_("%s sets topic to: %s"), username, topic); else msg = g_strdup_printf(_("%s clears topic"), username); purple_conv_chat_write(to, username, msg, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(msg);}static void nullprpl_set_chat_topic(PurpleConnection *gc, int id, const char *topic) { PurpleConversation *conv = purple_find_chat(gc, id); PurpleConvChat *chat = purple_conversation_get_chat_data(conv); const char *last_topic; if (!chat) return; purple_debug_info("nullprpl", "%s sets topic of chat room '%s' to '%s'\n", gc->account->username, conv->name, topic); last_topic = purple_conv_chat_get_topic(chat); if ((!topic && !last_topic) || (topic && last_topic && !strcmp(topic, last_topic))) return; /* topic is unchanged, this is a noop */ foreach_gc_in_chat(set_chat_topic_fn, gc, id, (gpointer)topic);}static gboolean nullprpl_finish_get_roomlist(gpointer roomlist) { purple_roomlist_set_in_progress((PurpleRoomlist *)roomlist, FALSE); return FALSE;}static PurpleRoomlist *nullprpl_roomlist_get_list(PurpleConnection *gc) { char *username = gc->account->username; PurpleRoomlist *roomlist = purple_roomlist_new(gc->account); GList *fields = NULL; PurpleRoomlistField *field; GList *chats; GList *seen_ids = NULL; purple_debug_info("nullprpl", "%s asks for room list; returning:\n", username); /* set up the room list */ field = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "room", "room", TRUE /* hidden */); fields = g_list_append(fields, field); field = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_INT, "Id", "Id", FALSE); fields = g_list_append(fields, field); purple_roomlist_set_fields(roomlist, fields); /* add each chat room. the chat ids are cached in seen_ids so that each room * is only returned once, even if multiple users are in it. */ for (chats = purple_get_chats(); chats; chats = g_list_next(chats)) { PurpleConversation *conv = (PurpleConversation *)chats->data; PurpleRoomlistRoom *room; char *name = conv->name; int id = purple_conversation_get_chat_data(conv)->id; /* have we already added this room? */ if (g_list_find_custom(seen_ids, name, (GCompareFunc)strcmp)) continue; /* yes! try the next one. */ seen_ids = g_list_append(seen_ids, name); /* no, it's new. */ purple_debug_info("nullprpl", "%s (%d), ", name, id); room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, name, NULL); purple_roomlist_room_add_field(roomlist, room, name); purple_roomlist_room_add_field(roomlist, room, &id); purple_roomlist_room_add(roomlist, room); } purple_timeout_add(1 /* ms */, nullprpl_finish_get_roomlist, roomlist); return roomlist;}static void nullprpl_roomlist_cancel(PurpleRoomlist *list) { purple_debug_info("nullprpl", "%s asked to cancel room list request\n", list->account->username);}static void nullprpl_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category) { purple_debug_info("nullprpl", "%s asked to expand room list category %s\n", list->account->username, category->name);}/* nullprpl doesn't support file transfer...yet... */static gboolean nullprpl_can_receive_file(PurpleConnection *gc, const char *who) { return FALSE;}static gboolean nullprpl_offline_message(const PurpleBuddy *buddy) { purple_debug_info("nullprpl", "reporting that offline messages are supported for %s\n", buddy->name); return TRUE;}/* * prpl stuff. see prpl.h for more information. */static PurplePluginProtocolInfo prpl_info ={ OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC, /* options */ NULL, /* user_splits, initialized in nullprpl_init() */ NULL, /* protocol_options, initialized in nullprpl_init() */ { /* icon_spec, a PurpleBuddyIconSpec */ "png,jpg,gif", /* format */ 0, /* min_width */ 0, /* min_height */ 128, /* max_width */ 128, /* max_height */ 10000, /* max_filesize */ PURPLE_ICON_SCALE_DISPLAY, /* scale_rules */ }, nullprpl_list_icon, /* list_icon */ nullprpl_list_emblem, /* list_emblem */ nullprpl_status_text, /* status_text */ nullprpl_tooltip_text, /* tooltip_text */ nullprpl_status_types, /* status_types */ nullprpl_blist_node_menu, /* blist_node_menu */ nullprpl_chat_info, /* chat_info */ nullprpl_chat_info_defaults, /* chat_info_defaults */ nullprpl_login, /* login */ nullprpl_close, /* close */ nullprpl_send_im, /* send_im */ nullprpl_set_info, /* set_info */ nullprpl_send_typing, /* send_typing */ nullprpl_get_info, /* get_info */ nullprpl_set_status, /* set_status */ nullprpl_set_idle, /* set_idle */ nullprpl_change_passwd, /* change_passwd */ nullprpl_add_buddy, /* add_buddy */ nullprpl_add_buddies, /* add_buddies */ nullprpl_remove_buddy, /* remove_buddy */ nullprpl_remove_buddies, /* remove_buddies */ nullprpl_add_permit, /* add_permit */ nullprpl_add_deny, /* add_deny */ nullprpl_rem_permit, /* rem_permit */ nullprpl_rem_deny, /* rem_deny */ nullprpl_set_permit_deny, /* set_permit_deny */ nullprpl_join_chat, /* join_chat */ nullprpl_reject_chat, /* reject_chat */ nullprpl_get_chat_name, /* get_chat_name */ nullprpl_chat_invite, /* chat_invite */ nullprpl_chat_leave, /* chat_leave */ nullprpl_chat_whisper, /* chat_whisper */ nullprpl_chat_send, /* chat_send */ NULL, /* keepalive */ nullprpl_register_user, /* register_user */ nullprpl_get_cb_info, /* get_cb_info */ NULL, /* get_cb_away */ nullprpl_alias_buddy, /* alias_buddy */ nullprpl_group_buddy, /* group_buddy */ nullprpl_rename_group, /* rename_group */ NULL, /* buddy_free */ nullprpl_convo_closed, /* convo_closed */ nullprpl_normalize, /* normalize */ nullprpl_set_buddy_icon, /* set_buddy_icon */ nullprpl_remove_group, /* remove_group */ NULL, /* get_cb_real_name */ nullprpl_set_chat_topic, /* set_chat_topic */ NULL, /* find_blist_chat */ nullprpl_roomlist_get_list, /* roomlist_get_list */ nullprpl_roomlist_cancel, /* roomlist_cancel */ nullprpl_roomlist_expand_category, /* roomlist_expand_category */ nullprpl_can_receive_file, /* can_receive_file */ NULL, /* send_file */ NULL, /* new_xfer */ nullprpl_offline_message, /* offline_message */ NULL, /* whiteboard_prpl_ops */ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ NULL, /* padding... */ NULL, NULL, NULL,};static void nullprpl_init(PurplePlugin *plugin){ /* see accountopt.h for information about user splits and protocol options */ PurpleAccountUserSplit *split = purple_account_user_split_new( _("Example user split (unused)"), /* text shown to user */ "default", /* default value */ '@'); /* field separator */ PurpleAccountOption *option = purple_account_option_string_new( _("Example option (unused)"), /* text shown to user */ "example", /* pref name */ "default"); /* default value */ purple_debug_info("nullprpl", "starting up\n"); prpl_info.user_splits = g_list_append(NULL, split); prpl_info.protocol_options = g_list_append(NULL, option); /* register whisper chat command, /msg */ purple_cmd_register("msg", "ws", /* args: recipient and message */ PURPLE_CMD_P_DEFAULT, /* priority */ PURPLE_CMD_FLAG_CHAT, "prpl-null", send_whisper, "msg <username> <message>: send a private message, aka a whisper", NULL); /* userdata */ /* get ready to store offline messages */ goffline_messages = g_hash_table_new_full(g_str_hash, /* hash fn */ g_str_equal, /* key comparison fn */ g_free, /* key free fn */ NULL); /* value free fn */ _null_protocol = plugin;}static void nullprpl_destroy(PurplePlugin *plugin) { purple_debug_info("nullprpl", "shutting down\n");}static PurplePluginInfo info ={ PURPLE_PLUGIN_MAGIC, /* magic */ PURPLE_MAJOR_VERSION, /* major_version */ PURPLE_MINOR_VERSION, /* minor_version */ PURPLE_PLUGIN_PROTOCOL, /* type */ NULL, /* ui_requirement */ 0, /* flags */ NULL, /* dependencies */ PURPLE_PRIORITY_DEFAULT, /* priority */ NULLPRPL_ID, /* id */ "Nullprpl", /* name */ "0.3", /* version */ "Null Protocol Plugin", /* summary */ "Null Protocol Plugin", /* description */ "Ryan Barrett <nullprpl@ryanb.org>", /* author */ "http://snarfed.org/space/pidgin+null+protocol+plugin", /* homepage */ NULL, /* load */ NULL, /* unload */ nullprpl_destroy, /* destroy */ NULL, /* ui_info */ &prpl_info, /* extra_info */ NULL, /* prefs_info */ nullprpl_actions, /* actions */ NULL, /* padding... */ NULL, NULL, NULL,};PURPLE_INIT_PLUGIN(null, nullprpl_init, info);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -