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

📄 ops.c

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