Example #1
0
void Irc_Rcon_Connected_f(void *connected) {
	qboolean * const c = (qboolean*) connected;
	if (!irc_rcon)
		irc_rcon = IRC_IMPORT.Cvar_Get("irc_rcon", "0", CVAR_ARCHIVE);
	if (!irc_rconTimeout)
		irc_rconTimeout = IRC_IMPORT.Cvar_Get("irc_rconTimeout", "300", CVAR_ARCHIVE);
	if (*c) {
		irc_command_t cmd;
		cmd.type = IRC_COMMAND_STRING;
		cmd.string = "PRIVMSG";				Irc_Proto_AddListener(cmd, Irc_Rcon_CmdPrivmsg_f);
		cmd.string = "QUIT";				Irc_Proto_AddListener(cmd, Irc_Rcon_CmdQuit_f);
		assert(!irc_rcon_users);
		IRC_IMPORT.Trie_Create(TRIE_CASE_SENSITIVE, &irc_rcon_users);
		assert(irc_rcon_users);
	} else {
		unsigned int i;
		trie_dump_t *dump;
		irc_command_t cmd;
		cmd.type = IRC_COMMAND_STRING;
		cmd.string = "PRIVMSG";				Irc_Proto_RemoveListener(cmd, Irc_Rcon_CmdPrivmsg_f);
		cmd.string = "QUIT";				Irc_Proto_RemoveListener(cmd, Irc_Rcon_CmdQuit_f);
		assert(irc_rcon_users);
		IRC_IMPORT.Trie_Dump(irc_rcon_users, "", TRIE_DUMP_VALUES, &dump);
		for (i = 0; i < dump->size; ++i)
			Irc_MemFree(dump->key_value_vector[i].value);
		IRC_IMPORT.Trie_FreeDump(dump);
		IRC_IMPORT.Trie_Destroy(irc_rcon_users);
		irc_rcon_users = NULL;
	}
}
Example #2
0
void Irc_Proto_CallListeners(irc_command_t cmd, const char *prefix, const char *params, const char *trailing) {
	irc_listener_node_t *n;
	switch (cmd.type) {
		case IRC_COMMAND_NUMERIC:
			// numeric command, search in numeric_listeners
			n = numeric_listeners[cmd.numeric];
			break;
		case IRC_COMMAND_STRING:
			// string command, search in string_listeners
			IRC_IMPORT.Trie_Find(string_listeners, cmd.string, TRIE_EXACT_MATCH, (void**) &n);
			break;
		default:
			n = NULL;
	}
	if (!n)
		// no specific listeners found, call generic listeners
		n = generic_listeners;
	// call all listeners in list
	immutable_listeners = true;
	for (; n; n = n->next)
		n->listener(cmd, prefix, params, trailing);
	immutable_listeners = false;
	// perform pending concurrent removals
	if (removed_listeners) {
		irc_removed_listener_node_t *rprev = NULL, *rn = removed_listeners;
		do {
			Irc_Proto_RemoveListener(rn->cmd, rn->listener);
			rprev = rn;
			rn = rn->next;
			Irc_MemFree(rprev);
		} while (rn);
		removed_listeners = NULL;
	}
}