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

📄 nullprpl.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
  type = purple_status_type_new(PURPLE_STATUS_AVAILABLE, NULL_STATUS_ONLINE,                                NULL_STATUS_ONLINE, TRUE);  purple_status_type_add_attr(type, "message", _("Online"),                              purple_value_new(PURPLE_TYPE_STRING));  types = g_list_append(types, type);  type = purple_status_type_new(PURPLE_STATUS_AWAY, NULL_STATUS_AWAY,                                NULL_STATUS_AWAY, TRUE);  purple_status_type_add_attr(type, "message", _("Away"),                              purple_value_new(PURPLE_TYPE_STRING));  types = g_list_append(types, type);    type = purple_status_type_new(PURPLE_STATUS_OFFLINE, NULL_STATUS_OFFLINE,                                NULL_STATUS_OFFLINE, TRUE);  purple_status_type_add_attr(type, "message", _("Offline"),                              purple_value_new(PURPLE_TYPE_STRING));  types = g_list_append(types, type);  return types;}static void blist_example_menu_item(PurpleBlistNode *node, gpointer userdata) {  purple_debug_info("nullprpl", "example menu item clicked on user",                    ((PurpleBuddy *)node)->name);  purple_notify_info(NULL,  /* plugin handle or PurpleConnection */                     _("Primary title"),                     _("Secondary title"),                     _("This is the callback for the nullprpl menu item."));}static GList *nullprpl_blist_node_menu(PurpleBlistNode *node) {  purple_debug_info("nullprpl", "providing buddy list context menu item\n");  if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {    PurpleMenuAction *action = purple_menu_action_new(      _("Nullprpl example menu item"),      PURPLE_CALLBACK(blist_example_menu_item),      NULL,   /* userdata passed to the callback */      NULL);  /* child menu items */    return g_list_append(NULL, action);  } else {    return NULL;  }}static GList *nullprpl_chat_info(PurpleConnection *gc) {  struct proto_chat_entry *pce; /* defined in prpl.h */  purple_debug_info("nullprpl", "returning chat setting 'room'\n");  pce = g_new0(struct proto_chat_entry, 1);  pce->label = _(_("Chat _room"));  pce->identifier = "room";  pce->required = TRUE;  return g_list_append(NULL, pce);}static GHashTable *nullprpl_chat_info_defaults(PurpleConnection *gc,                                               const char *room) {  GHashTable *defaults;  purple_debug_info("nullprpl", "returning chat default setting "                    "'room' = 'default'\n");  defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);  g_hash_table_insert(defaults, "room", g_strdup("default"));  return defaults;}  static void nullprpl_login(PurpleAccount *acct){  PurpleConnection *gc = purple_account_get_connection(acct);  GList *offline_messages;  purple_debug_info("nullprpl", "logging in %s\n", acct->username);  purple_connection_update_progress(gc, _("Connecting"),                                    0,   /* which connection step this is */                                    2);  /* total number of steps */  purple_connection_update_progress(gc, _("Connected"),                                    1,   /* which connection step this is */                                    2);  /* total number of steps */  purple_connection_set_state(gc, PURPLE_CONNECTED);  /* tell purple about everyone on our buddy list who's connected */  foreach_nullprpl_gc(discover_status, gc, NULL);  /* notify other nullprpl accounts */  foreach_nullprpl_gc(report_status_change, gc, NULL);  /* fetch stored offline messages */  purple_debug_info("nullprpl", "checking for offline messages for %s\n",                    acct->username);  offline_messages = g_hash_table_lookup(goffline_messages, acct->username);   while (offline_messages) {    GOfflineMessage *message = (GOfflineMessage *)offline_messages->data;    purple_debug_info("nullprpl", "delivering offline message to %s: %s\n",                      acct->username, message->message);    serv_got_im(gc, message->from, message->message, message->flags,                message->mtime);    offline_messages = g_list_next(offline_messages);    g_free(message->from);    g_free(message->message);    g_free(message);  }  g_list_free(offline_messages);  g_hash_table_remove(goffline_messages, &acct->username);}static void nullprpl_close(PurpleConnection *gc){  /* notify other nullprpl accounts */  foreach_nullprpl_gc(report_status_change, gc, NULL);}static int nullprpl_send_im(PurpleConnection *gc, const char *who,                            const char *message, PurpleMessageFlags flags){  const char *from_username = gc->account->username;  PurpleMessageFlags receive_flags = ((flags & ~PURPLE_MESSAGE_SEND)                                      | PURPLE_MESSAGE_RECV);  PurpleAccount *to_acct = purple_accounts_find(who, NULLPRPL_ID);  PurpleConnection *to;  purple_debug_info("nullprpl", "sending message from %s to %s: %s\n",                    from_username, who, message);  /* is the sender blocked by the recipient's privacy settings? */  if (to_acct && !purple_privacy_check(to_acct, gc->account->username)) {    char *msg = g_strdup_printf(      _("Your message was blocked by %s's privacy settings."), who);    purple_debug_info("nullprpl",                      "discarding; %s is blocked by %s's privacy settings\n",                      from_username, who);    purple_conv_present_error(who, gc->account, msg);    g_free(msg);    return 0;  }  /* is the recipient online? */  to = get_nullprpl_gc(who);  if (to) {  /* yes, send */    serv_got_im(to, from_username, message, receive_flags, time(NULL));  } else {  /* nope, store as an offline message */    GOfflineMessage *offline_message;    GList *messages;    purple_debug_info("nullprpl",                      "%s is offline, sending as offline message\n", who);    offline_message = g_new0(GOfflineMessage, 1);    offline_message->from = g_strdup(from_username);    offline_message->message = g_strdup(message);    offline_message->mtime = time(NULL);    offline_message->flags = receive_flags;    messages = g_hash_table_lookup(goffline_messages, who);    messages = g_list_append(messages, offline_message);    g_hash_table_insert(goffline_messages, g_strdup(who), messages);  }   return 1;}static void nullprpl_set_info(PurpleConnection *gc, const char *info) {  purple_debug_info("nullprpl", "setting %s's user info to %s\n",                    gc->account->username, info);}static char *typing_state_to_string(PurpleTypingState typing) {  switch (typing) {  case PURPLE_NOT_TYPING:  return "is not typing";  case PURPLE_TYPING:      return "is typing";  case PURPLE_TYPED:       return "stopped typing momentarily";  default:               return "unknown typing state";  }}static void notify_typing(PurpleConnection *from, PurpleConnection *to,                          gpointer typing) {  char *from_username = from->account->username;  char *action = typing_state_to_string((PurpleTypingState)typing);  purple_debug_info("nullprpl", "notifying %s that %s %s\n",                    to->account->username, from_username, action);  serv_got_typing(to,                  from_username,                  0, /* if non-zero, a timeout in seconds after which to                      * reset the typing status to PURPLE_NOT_TYPING */                  (PurpleTypingState)typing);}static unsigned int nullprpl_send_typing(PurpleConnection *gc, const char *name,                                         PurpleTypingState typing) {  purple_debug_info("nullprpl", "%s %s\n", gc->account->username,                    typing_state_to_string(typing));  foreach_nullprpl_gc(notify_typing, gc, (gpointer)typing);  return 0;}static void nullprpl_get_info(PurpleConnection *gc, const char *username) {  const char *body;  PurpleNotifyUserInfo *info = purple_notify_user_info_new();  PurpleAccount *acct;  purple_debug_info("nullprpl", "Fetching %s's user info for %s\n", username,                    gc->account->username);  if (!get_nullprpl_gc(username)) {    char *msg = g_strdup_printf(_("%s is not logged in."), username);    purple_notify_error(gc, _("User Info"), _("User info not available. "), msg);    g_free(msg);  }  acct = purple_accounts_find(username, NULLPRPL_ID);  if (acct)    body = purple_account_get_user_info(acct);  else    body = _("No user info.");  purple_notify_user_info_add_pair(info, "Info", body);  /* show a buddy's user info in a nice dialog box */  purple_notify_userinfo(gc,        /* connection the buddy info came through */                         username,  /* buddy's username */                         info,      /* body */                         NULL,      /* callback called when dialog closed */                         NULL);     /* userdata for callback */}static void nullprpl_set_status(PurpleAccount *acct, PurpleStatus *status) {  const char *msg = purple_status_get_attr_string(status, "message");  purple_debug_info("nullprpl", "setting %s's status to %s: %s\n",                    acct->username, purple_status_get_name(status), msg);  foreach_nullprpl_gc(report_status_change, get_nullprpl_gc(acct->username),                      NULL);}static void nullprpl_set_idle(PurpleConnection *gc, int idletime) {  purple_debug_info("nullprpl",                    "purple reports that %s has been idle for %d seconds\n",                    gc->account->username, idletime);}static void nullprpl_change_passwd(PurpleConnection *gc, const char *old_pass,                                   const char *new_pass) {  purple_debug_info("nullprpl", "%s wants to change their password\n",                    gc->account->username);}static void nullprpl_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,                               PurpleGroup *group){  char *username = gc->account->username;  PurpleConnection *buddy_gc = get_nullprpl_gc(buddy->name);  purple_debug_info("nullprpl", "adding %s to %s's buddy list\n", buddy->name,                    username);  if (buddy_gc) {    PurpleAccount *buddy_acct = buddy_gc->account;    discover_status(gc, buddy_gc, NULL);    if (purple_find_buddy(buddy_acct, username)) {      purple_debug_info("nullprpl", "%s is already on %s's buddy list\n",                        username, buddy->name);    } else {      purple_debug_info("nullprpl", "asking %s if they want to add %s\n",                        buddy->name, username);      purple_account_request_add(buddy_acct,                                 username,                                 NULL,   /* local account id (rarely used) */                                 NULL,   /* alias */                                 NULL);  /* message */    }  }}static void nullprpl_add_buddies(PurpleConnection *gc, GList *buddies,                                 GList *groups) {  GList *buddy = buddies;  GList *group = groups;  purple_debug_info("nullprpl", "adding multiple buddies\n");  while (buddy && group) {    nullprpl_add_buddy(gc, (PurpleBuddy *)buddy->data, (PurpleGroup *)group->data);    buddy = g_list_next(buddy);    group = g_list_next(group);  }}static void nullprpl_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,                                  PurpleGroup *group){

⌨️ 快捷键说明

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