📄 silc.c
字号:
SilcClientConnection conn = sg->conn; SilcDList clients; SilcClientEntry client_entry; SilcUInt32 mflags; char *msg, *tmp; int ret = 0; gboolean sign = purple_account_get_bool(sg->account, "sign-verify", FALSE); SilcDList list; if (!who || !message) return 0; mflags = SILC_MESSAGE_FLAG_UTF8; tmp = msg = purple_unescape_html(message); if (!g_ascii_strncasecmp(msg, "/me ", 4)) { msg += 4; if (!*msg) { g_free(tmp); return 0; } mflags |= SILC_MESSAGE_FLAG_ACTION; } else if (strlen(msg) > 1 && msg[0] == '/') { if (!silc_client_command_call(client, conn, msg + 1)) purple_notify_error(gc, _("Call Command"), _("Cannot call command"), _("Unknown command")); g_free(tmp); return 0; } if (sign) mflags |= SILC_MESSAGE_FLAG_SIGNED; /* Find client entry */ clients = silc_client_get_clients_local(client, conn, who, FALSE); if (!clients) { /* Resolve unknown user */ SilcPurpleIM im = silc_calloc(1, sizeof(*im)); if (!im) { g_free(tmp); return 0; } im->nick = g_strdup(who); im->message = g_strdup(message); im->message_len = strlen(im->message); im->flags = mflags; im->gflags = flags; silc_client_get_clients(client, conn, who, NULL, silcpurple_send_im_resolved, im); g_free(tmp); return 0; } silc_dlist_start(clients); client_entry = silc_dlist_get(clients); /* Check for images */ if (flags & PURPLE_MESSAGE_IMAGES) { list = silcpurple_image_message(message, &mflags); if (list) { /* Send one or more MIME message. If more than one, they are MIME fragments due to over large message */ SilcBuffer buf; silc_dlist_start(list); while ((buf = silc_dlist_get(list)) != SILC_LIST_END) ret = silc_client_send_private_message(client, conn, client_entry, mflags, NULL, buf->data, silc_buffer_len(buf)); silc_mime_partial_free(list); g_free(tmp); silc_client_list_free(client, conn, clients); return ret; } } /* Send private message directly */ ret = silc_client_send_private_message(client, conn, client_entry, mflags, NULL, (unsigned char *)msg, strlen(msg)); g_free(tmp); silc_client_list_free(client, conn, clients); return ret;}static GList *silcpurple_blist_node_menu(PurpleBlistNode *node) { /* split this single menu building function back into the two original: one for buddies and one for chats */ if(PURPLE_BLIST_NODE_IS_CHAT(node)) { return silcpurple_chat_menu((PurpleChat *) node); } else if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { return silcpurple_buddy_menu((PurpleBuddy *) node); } else { g_return_val_if_reached(NULL); }}/********************************* Commands **********************************/static PurpleCmdRet silcpurple_cmd_chat_part(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; PurpleConversation *convo = conv; int id = 0; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; if(args && args[0]) convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[0], gc->account); if (convo != NULL) id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)); if (id == 0) return PURPLE_CMD_RET_FAILED; silcpurple_chat_leave(gc, id); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_chat_topic(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; int id = 0; char *buf, *tmp, *tmp2; const char *topic; gc = purple_conversation_get_gc(conv); id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); if (gc == NULL || id == 0) return PURPLE_CMD_RET_FAILED; if (!args || !args[0]) { topic = purple_conv_chat_get_topic (PURPLE_CONV_CHAT(conv)); if (topic) { tmp = g_markup_escape_text(topic, -1); tmp2 = purple_markup_linkify(tmp); buf = g_strdup_printf(_("current topic is: %s"), tmp2); g_free(tmp); g_free(tmp2); } else buf = g_strdup(_("No topic is set")); purple_conv_chat_write(PURPLE_CONV_CHAT(conv), gc->account->username, buf, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(buf); } if (args && args[0] && (strlen(args[0]) > 255)) { *error = g_strdup(_("Topic too long")); return PURPLE_CMD_RET_FAILED; } silcpurple_chat_set_topic(gc, id, args ? args[0] : NULL); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_chat_join(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ GHashTable *comp; if(!args || !args[0]) return PURPLE_CMD_RET_FAILED; comp = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); g_hash_table_replace(comp, "channel", args[0]); if(args[1]) g_hash_table_replace(comp, "passphrase", args[1]); silcpurple_chat_join(purple_conversation_get_gc(conv), comp); g_hash_table_destroy(comp); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_chat_list(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; gc = purple_conversation_get_gc(conv); purple_roomlist_show_with_account(purple_connection_get_account(gc)); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_whois(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; silcpurple_get_info(gc, args[0]); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_msg(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ int ret; PurpleConnection *gc; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; ret = silcpurple_send_im(gc, args[0], args[1], PURPLE_MESSAGE_SEND); if (ret) return PURPLE_CMD_RET_OK; else return PURPLE_CMD_RET_FAILED;}static PurpleCmdRet silcpurple_cmd_query(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ int ret = 1; PurpleConversation *convo; PurpleConnection *gc; PurpleAccount *account; if (!args || !args[0]) { *error = g_strdup(_("You must specify a nick")); return PURPLE_CMD_RET_FAILED; } gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; account = purple_connection_get_account(gc); convo = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, args[0]); if (args[1]) { ret = silcpurple_send_im(gc, args[0], args[1], PURPLE_MESSAGE_SEND); purple_conv_im_write(PURPLE_CONV_IM(convo), purple_connection_get_display_name(gc), args[1], PURPLE_MESSAGE_SEND, time(NULL)); } if (ret) return PURPLE_CMD_RET_OK; else return PURPLE_CMD_RET_FAILED;}static PurpleCmdRet silcpurple_cmd_motd(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; SilcPurple sg; char *tmp; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; sg = gc->proto_data; if (sg == NULL) return PURPLE_CMD_RET_FAILED; if (!sg->motd) { *error = g_strdup(_("There is no Message of the Day associated with this connection")); return PURPLE_CMD_RET_FAILED; } tmp = g_markup_escape_text(sg->motd, -1); purple_notify_formatted(gc, NULL, _("Message of the Day"), NULL, tmp, NULL, NULL); g_free(tmp); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_detach(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; SilcPurple sg; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; sg = gc->proto_data; if (sg == NULL) return PURPLE_CMD_RET_FAILED; silc_client_command_call(sg->client, sg->conn, "DETACH"); sg->detaching = TRUE; return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_cmode(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; SilcPurple sg; SilcChannelEntry channel; char *silccmd, *silcargs, *msg, tmp[256]; const char *chname; gc = purple_conversation_get_gc(conv); if (gc == NULL || !args || gc->proto_data == NULL) return PURPLE_CMD_RET_FAILED; sg = gc->proto_data; if (args[0]) chname = args[0]; else chname = purple_conversation_get_name(conv); if (!args[1]) { channel = silc_client_get_channel(sg->client, sg->conn, (char *)chname); if (!channel) { *error = g_strdup_printf(_("channel %s not found"), chname); return PURPLE_CMD_RET_FAILED; } if (channel->mode) { silcpurple_get_chmode_string(channel->mode, tmp, sizeof(tmp)); msg = g_strdup_printf(_("channel modes for %s: %s"), chname, tmp); } else { msg = g_strdup_printf(_("no channel modes are set on %s"), chname); } purple_conv_chat_write(PURPLE_CONV_CHAT(conv), "", msg, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(msg); return PURPLE_CMD_RET_OK; } silcargs = g_strjoinv(" ", args); silccmd = g_strconcat(cmd, " ", args ? silcargs : NULL, NULL); g_free(silcargs); if (!silc_client_command_call(sg->client, sg->conn, silccmd)) { g_free(silccmd); *error = g_strdup_printf(_("Failed to set cmodes for %s"), args[0]); return PURPLE_CMD_RET_FAILED; } g_free(silccmd); return PURPLE_CMD_RET_OK;}static PurpleCmdRet silcpurple_cmd_generic(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data){ PurpleConnection *gc; SilcPurple sg; char *silccmd, *silcargs; gc = purple_conversation_get_gc(conv); if (gc == NULL) return PURPLE_CMD_RET_FAILED; sg = gc->proto_data; if (sg == NULL) return PURPLE_CMD_RET_FAILED; silcargs = g_strjoinv(" ", args); silccmd = g_strconcat(cmd, " ", args ? silcargs : NULL, NULL); g_free(silcargs); if (!silc_client_command_call(sg->client, sg->conn, silccmd)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -