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

📄 silc.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -