📄 ops.c
字号:
g_snprintf(buf, sizeof(buf), "%s@%s", client_entry->username, client_entry->hostname); purple_conv_chat_add_user(PURPLE_CONV_CHAT(convo), g_strdup(client_entry->nickname), buf, PURPLE_CBFLAGS_NONE, TRUE); break; case SILC_NOTIFY_TYPE_LEAVE: client_entry = va_arg(va, SilcClientEntry); channel = va_arg(va, SilcChannelEntry); convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel->channel_name, sg->account); if (!convo) break; /* Remove user from channel */ purple_conv_chat_remove_user(PURPLE_CONV_CHAT(convo), client_entry->nickname, NULL); break; case SILC_NOTIFY_TYPE_SIGNOFF: client_entry = va_arg(va, SilcClientEntry); tmp = va_arg(va, char *); /* Remove from all channels */ silc_hash_table_list(client_entry->channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chu->channel->channel_name, sg->account); if (!convo) continue; purple_conv_chat_remove_user(PURPLE_CONV_CHAT(convo), client_entry->nickname, tmp); } silc_hash_table_list_reset(&htl); break; case SILC_NOTIFY_TYPE_TOPIC_SET: { char *esc, *tmp2; idtype = va_arg(va, int); entry = va_arg(va, void *); tmp = va_arg(va, char *); channel = va_arg(va, SilcChannelEntry); convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel->channel_name, sg->account); if (!convo) break; if (!tmp) break; esc = g_markup_escape_text(tmp, -1); tmp2 = purple_markup_linkify(esc); g_free(esc); if (idtype == SILC_ID_CLIENT) { client_entry = (SilcClientEntry)entry; g_snprintf(buf, sizeof(buf), _("%s has changed the topic of <I>%s</I> to: %s"), client_entry->nickname, channel->channel_name, tmp2); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), client_entry->nickname, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), client_entry->nickname, tmp); } else if (idtype == SILC_ID_SERVER) { server_entry = (SilcServerEntry)entry; g_snprintf(buf, sizeof(buf), _("%s has changed the topic of <I>%s</I> to: %s"), server_entry->server_name, channel->channel_name, tmp2); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), server_entry->server_name, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), server_entry->server_name, tmp); } else if (idtype == SILC_ID_CHANNEL) { channel = (SilcChannelEntry)entry; g_snprintf(buf, sizeof(buf), _("%s has changed the topic of <I>%s</I> to: %s"), channel->channel_name, channel->channel_name, tmp2); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), channel->channel_name, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), channel->channel_name, tmp); } else { purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), NULL, tmp); } g_free(tmp2); break; } case SILC_NOTIFY_TYPE_NICK_CHANGE: client_entry = va_arg(va, SilcClientEntry); tmp = va_arg(va, char *); /* Old nick */ name = va_arg(va, char *); /* New nick */ if (!strcmp(tmp, name)) break; /* Change nick on all channels */ silc_hash_table_list(client_entry->channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chu->channel->channel_name, sg->account); if (!convo) continue; if (purple_conv_chat_find_user(PURPLE_CONV_CHAT(convo), client_entry->nickname)) purple_conv_chat_rename_user(PURPLE_CONV_CHAT(convo), tmp, name); } silc_hash_table_list_reset(&htl); break; case SILC_NOTIFY_TYPE_CMODE_CHANGE: idtype = va_arg(va, int); entry = va_arg(va, void *); mode = va_arg(va, SilcUInt32); (void)va_arg(va, char *); (void)va_arg(va, char *); (void)va_arg(va, char *); (void)va_arg(va, SilcPublicKey); (void)va_arg(va, SilcDList); channel = va_arg(va, SilcChannelEntry); convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel->channel_name, sg->account); if (!convo) break; if (idtype == SILC_ID_CLIENT) name = ((SilcClientEntry)entry)->nickname; else if (idtype == SILC_ID_SERVER) name = ((SilcServerEntry)entry)->server_name; else name = ((SilcChannelEntry)entry)->channel_name; if (!name) break; if (mode) { silcpurple_get_chmode_string(mode, buf2, sizeof(buf2)); g_snprintf(buf, sizeof(buf), _("<I>%s</I> set channel <I>%s</I> modes to: %s"), name, channel->channel_name, buf2); } else { g_snprintf(buf, sizeof(buf), _("<I>%s</I> removed all channel <I>%s</I> modes"), name, channel->channel_name); } purple_conv_chat_write(PURPLE_CONV_CHAT(convo), channel->channel_name, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); break; case SILC_NOTIFY_TYPE_CUMODE_CHANGE: { PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE; idtype = va_arg(va, int); entry = va_arg(va, void *); mode = va_arg(va, SilcUInt32); client_entry2 = va_arg(va, SilcClientEntry); channel = va_arg(va, SilcChannelEntry); convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel->channel_name, sg->account); if (!convo) break; if (idtype == SILC_ID_CLIENT) name = ((SilcClientEntry)entry)->nickname; else if (idtype == SILC_ID_SERVER) name = ((SilcServerEntry)entry)->server_name; else name = ((SilcChannelEntry)entry)->channel_name; if (!name) break; if (mode) { silcpurple_get_chumode_string(mode, buf2, sizeof(buf2)); g_snprintf(buf, sizeof(buf), _("<I>%s</I> set <I>%s's</I> modes to: %s"), name, client_entry2->nickname, buf2); if (mode & SILC_CHANNEL_UMODE_CHANFO) flags |= PURPLE_CBFLAGS_FOUNDER; if (mode & SILC_CHANNEL_UMODE_CHANOP) flags |= PURPLE_CBFLAGS_OP; } else { g_snprintf(buf, sizeof(buf), _("<I>%s</I> removed all <I>%s's</I> modes"), name, client_entry2->nickname); } purple_conv_chat_write(PURPLE_CONV_CHAT(convo), channel->channel_name, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(convo), client_entry2->nickname, flags); break; } case SILC_NOTIFY_TYPE_MOTD: tmp = va_arg(va, char *); silc_free(sg->motd); sg->motd = silc_memdup(tmp, strlen(tmp)); break; case SILC_NOTIFY_TYPE_KICKED: client_entry = va_arg(va, SilcClientEntry); tmp = va_arg(va, char *); client_entry2 = va_arg(va, SilcClientEntry); channel = va_arg(va, SilcChannelEntry); convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel->channel_name, sg->account); if (!convo) break; if (client_entry == conn->local_entry) { /* Remove us from channel */ g_snprintf(buf, sizeof(buf), _("You have been kicked off <I>%s</I> by <I>%s</I> (%s)"), channel->channel_name, client_entry2->nickname, tmp ? tmp : ""); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), client_entry->nickname, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); serv_got_chat_left(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo))); } else { /* Remove user from channel */ g_snprintf(buf, sizeof(buf), _("Kicked by %s (%s)"), client_entry2->nickname, tmp ? tmp : ""); purple_conv_chat_remove_user(PURPLE_CONV_CHAT(convo), client_entry->nickname, buf); } break; case SILC_NOTIFY_TYPE_KILLED: client_entry = va_arg(va, SilcClientEntry); tmp = va_arg(va, char *); idtype = va_arg(va, int); entry = va_arg(va, SilcClientEntry); if (client_entry == conn->local_entry) { if (idtype == SILC_ID_CLIENT) { client_entry2 = (SilcClientEntry)entry; g_snprintf(buf, sizeof(buf), _("You have been killed by %s (%s)"), client_entry2->nickname, tmp ? tmp : ""); } else if (idtype == SILC_ID_SERVER) { server_entry = (SilcServerEntry)entry; g_snprintf(buf, sizeof(buf), _("You have been killed by %s (%s)"), server_entry->server_name, tmp ? tmp : ""); } else if (idtype == SILC_ID_CHANNEL) { channel = (SilcChannelEntry)entry; g_snprintf(buf, sizeof(buf), _("You have been killed by %s (%s)"), channel->channel_name, tmp ? tmp : ""); } /* Remove us from all channels */ silc_hash_table_list(client_entry->channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chu->channel->channel_name, sg->account); if (!convo) continue; purple_conv_chat_write(PURPLE_CONV_CHAT(convo), client_entry->nickname, buf, PURPLE_MESSAGE_SYSTEM, time(NULL)); serv_got_chat_left(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo))); } silc_hash_table_list_reset(&htl); } else { if (idtype == SILC_ID_CLIENT) { client_entry2 = (SilcClientEntry)entry; g_snprintf(buf, sizeof(buf), _("Killed by %s (%s)"), client_entry2->nickname, tmp ? tmp : ""); } else if (idtype == SILC_ID_SERVER) { server_entry = (SilcServerEntry)entry; g_snprintf(buf, sizeof(buf), _("Killed by %s (%s)"), server_entry->server_name, tmp ? tmp : ""); } else if (idtype == SILC_ID_CHANNEL) { channel = (SilcChannelEntry)entry; g_snprintf(buf, sizeof(buf), _("Killed by %s (%s)"), channel->channel_name, tmp ? tmp : ""); } /* Remove user from all channels */ silc_hash_table_list(client_entry->channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chu->channel->channel_name, sg->account); if (!convo) continue; purple_conv_chat_remove_user(PURPLE_CONV_CHAT(convo), client_entry->nickname, tmp); } silc_hash_table_list_reset(&htl); } break; case SILC_NOTIFY_TYPE_CHANNEL_CHANGE: break; case SILC_NOTIFY_TYPE_SERVER_SIGNOFF: (void)va_arg(va, void *); list = va_arg(va, SilcDList); silc_dlist_start(list); while ((client_entry = silc_dlist_get(list))) { /* Remove from all channels */ silc_hash_table_list(client_entry->channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chu->channel->channel_name, sg->account); if (!convo) continue; purple_conv_chat_remove_user(PURPLE_CONV_CHAT(convo), client_entry->nickname, _("Server signoff")); } silc_hash_table_list_reset(&htl); } break; case SILC_NOTIFY_TYPE_ERROR: { SilcStatus error = va_arg(va, int); purple_notify_error(gc, "Error Notify", silc_get_status_message(error), NULL); } break; case SILC_NOTIFY_TYPE_WATCH: { SilcPublicKey public_key; unsigned char *pk; SilcUInt32 pk_len; char *fingerprint; client_entry = va_arg(va, SilcClientEntry); (void)va_arg(va, char *); mode = va_arg(va, SilcUInt32); notify = va_arg(va, int); public_key = va_arg(va, SilcPublicKey); b = NULL; if (public_key) { PurpleBlistNode *gnode, *cnode, *bnode; const char *f; pk = silc_pkcs_public_key_encode(public_key, &pk_len); if (!pk) break; fingerprint = silc_hash_fingerprint(NULL, pk, pk_len); for (i = 0; i < strlen(fingerprint); i++) if (fingerprint[i] == ' ') fingerprint[i] = '_'; g_snprintf(buf, sizeof(buf) - 1, "%s" G_DIR_SEPARATOR_S "clientkeys" G_DIR_SEPARATOR_S "clientkey_%s.pub", silcpurple_silcdir(), fingerprint); silc_free(fingerprint); silc_free(pk); /* Find buddy by associated public key */ for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if (!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for (cnode = gnode->child; cnode; cnode = cnode->next) { if( !PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for (bnode = cnode->child; bnode; bnode = bnode->next) { if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (PurpleBuddy *)bnode; if (b->account != gc->account) continue; f = purple_blist_node_get_string(bnode, "public-key"); if (f && !strcmp(f, buf)) goto cont; b = NULL; } } } } cont: if (!b) { /* Find buddy by nickname */ b = purple_find_buddy(sg->account, client_entry->nickname); if (!b) { purple_debug_warning("silc", "WATCH for %s, unknown buddy", client_entry->nickname); break; } } silc_free(b->proto_data); b->proto_data = silc_memdup(&client_entry->id, sizeof(client_entry->id)); if (notify == SILC_NOTIFY_TYPE_NICK_CHANGE) { break; } else if (notify == SILC_NOTIFY_TYPE_UMODE_CHANGE) { /* See if client was away and is now present */ if (!(mode & (SILC_UMODE_GONE | SILC_UMODE_INDISPOSED | SILC_UMODE_BUSY | SILC_UMODE_PAGE | SILC_UMODE_DETACHED)) && (client_entry->mode & SILC_UMODE_GONE || client_entry->mode & SILC_UMODE_INDISPOSED || client_entry->mode & SILC_UMODE_BUSY || client_entry->mode & SILC_UMODE_PAGE || client_entry->mode & SILC_UMODE_DETACHED)) { client_entry->mode = mode; purple_prpl_got_user_status(purple_buddy_get_account(b), purple_buddy_get_name(b), SILCPURPLE_STATUS_ID_AVAILABLE, NULL); } else if ((mode & SILC_UMODE_GONE) || (mode & SILC_UMODE_INDISPOSED) || (mode & SILC_UMODE_BUSY) || (mode & SILC_UMODE_PAGE) || (mode & SILC_UMODE_DETACHED)) { client_entry->mode = mode; purple_prpl_got_user_status(purple_buddy_get_account(b), purple_buddy_get_name(b), SILCPURPLE_STATUS_ID_OFFLINE, NULL); } } else if (notify == SILC_NOTIFY_TYPE_SIGNOFF || notify == SILC_NOTIFY_TYPE_SERVER_SIGNOFF || notify == SILC_NOTIFY_TYPE_KILLED) { client_entry->mode = mode; purple_prpl_got_user_status(purple_buddy_get_account(b), purple_buddy_get_name(b), SILCPURPLE_STATUS_ID_OFFLINE, NULL); } else if (notify == SILC_NOTIFY_TYPE_NONE) { client_entry->mode = mode; purple_prpl_got_user_status(purple_buddy_get_account(b), purple_buddy_get_name(b), SILCPURPLE_STATUS_ID_AVAILABLE, NULL); } } break; default: purple_debug_info("silc", "Unhandled notification: %d\n", type); break; } va_end(va);}/* Command handler. This function is called always after application has called a command. It will be called to indicate that the command was processed. It will also be called if error occurs while processing the command. The `success' indicates whether the command was sent or if error occurred. The `status' indicates the actual error. The `argc' and `argv' are the command line arguments sent to the command by application. Note that, this is not reply to the command from server, this is merely and indication to application that the command was processed. */static voidsilc_command(SilcClient client, SilcClientConnection conn, SilcBool success, SilcCommand command, SilcStatus status,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -