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; } }
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; } }