#include <eggdrop/eggdrop.h>
Go to the source code of this file.
Functions | |
static int | partymember_cleanup (void *client_data) |
static int | on_udelete (user_t *u) |
int | partymember_init (void) |
int | partymember_shutdown (void) |
static void | partymember_really_delete (partymember_t *p) |
partymember_t * | partymember_get_head () |
partymember_t * | partymember_get_local_head () |
static int | partymember_get_id (botnet_bot_t *bot) |
partymember_t * | partymember_new (int id, user_t *user, botnet_bot_t *bot, const char *nick, const char *ident, const char *host, partyline_event_t *handler, void *client_data, event_owner_t *owner) |
int | partymember_delete_by_owner (struct egg_module *module, void *script) |
Deletes all partymembers with a given owner. | |
int | partymember_delete (partymember_t *p, const botnet_bot_t *lost_bot, const char *text) |
int | partymember_set_nick (partymember_t *p, const char *nick) |
int | partymember_update_info (partymember_t *p, const char *ident, const char *host) |
int | partymember_who (int **ids, int *len) |
partymember_t * | partymember_lookup (const char *full_name, botnet_bot_t *bot, int id) |
int | partymember_write (partymember_t *p, const char *text, int len) |
int | partymember_msg (partymember_t *p, botnet_entity_t *src, const char *text, int len) |
int | partymember_local_broadcast (botnet_entity_t *src, const char *text, int len) |
int | partymember_printf (partymember_t *p, const char *fmt,...) |
int | partymember_msgf (partymember_t *p, botnet_entity_t *src, const char *fmt,...) |
int | partymember_count_by_bot (const struct botnet_bot *bot) |
Counts the number of users on a bot. | |
int | partymember_delete_by_bot (const botnet_bot_t *bot, const botnet_bot_t *lost_bot, const char *reason) |
Deletes all users on a bot. | |
Variables | |
static const char | rcsid [] = "$Id: partymember.c,v 1.31 2007-09-13 22:20:55 sven Exp $" |
static partymember_t * | party_head = NULL |
static partymember_t * | local_party_head = NULL |
static int | npartymembers = 0 |
static bind_list_t | partymember_udelete_binds [] |
static bind_table_t * | BT_nick = NULL |
static bind_table_t * | BT_new = NULL |
static bind_table_t * | BT_quit = NULL |
static int on_udelete | ( | user_t * | u | ) | [static] |
Definition at line 418 of file partymember.c.
References partymember::next_on_bot, NULL, partymember_delete(), and partymember::user.
00419 { 00420 partymember_t *p; 00421 00422 for (p = local_party_head; p; p = p->next_on_bot) { 00423 if (p->user == u) partymember_delete(p, NULL, "User deleted!"); 00424 } 00425 return(0); 00426 }
static int partymember_cleanup | ( | void * | client_data | ) | [static] |
Definition at line 91 of file partymember.c.
References partymember::flags, partymember::next, botnet_bot::next, PARTY_DELETED, and partymember_really_delete().
Referenced by partymember_delete().
00092 { 00093 partymember_t *p, *next; 00094 00095 for (p = party_head; p; p = next) { 00096 next = p->next; 00097 if (p->flags & PARTY_DELETED) partymember_really_delete(p); 00098 } 00099 return(0); 00100 }
int partymember_count_by_bot | ( | const struct botnet_bot * | bot | ) |
Counts the number of users on a bot.
Counts the number of users on any channels on a bot.
bot | The bot the users are on or NULL for the number of users on this bot. |
Definition at line 438 of file partymember.c.
References partymember::flags, partymember::next_on_bot, PARTY_DELETED, and botnet_bot::partys.
Referenced by botnet_count_subtree().
00439 { 00440 int ret = 0; 00441 partymember_t *p; 00442 00443 for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) { 00444 if (p->flags & PARTY_DELETED) continue; 00445 ++ret; 00446 } 00447 return ret; 00448 }
int partymember_delete | ( | partymember_t * | p, | |
const botnet_bot_t * | lost_bot, | |||
const char * | text | |||
) |
Definition at line 191 of file partymember.c.
References bind_check(), partymember::bot, botnet_member_quit(), BT_quit, partymember::channels, partymember::client_data, partymember::flags, garbage_add(), GARBAGE_ONCE, partymember::handler, partymember_common::len, partymember_common::members, partymember::nchannels, partymember::nick, npartymembers, NULL, event_owner_b::on_delete, partyline_event::on_quit, partymember::owner, PARTY_DELETED, partychan_free_common(), partychan_get_common(), partychan_part(), and partymember_cleanup().
Referenced by dcc_on_delete(), dcc_on_eof(), get_entity(), got_join(), got_part(), got_quit(), got_versions(), irc_on_delete(), irc_on_eof(), on_udelete(), party_quit(), partymember_delete_by_bot(), partymember_delete_by_owner(), partymember_shutdown(), telnet_on_delete(), telnet_on_eof(), and terminal_shutdown().
00192 { 00193 int i, len; 00194 partymember_common_t *common; 00195 partymember_t *mem; 00196 00197 if (p->flags & PARTY_DELETED) return(-1); 00198 00199 len = strlen(text); 00200 00201 if (!lost_bot && p->nchannels) botnet_member_quit(p, text, len); 00202 00203 bind_check(BT_quit, NULL, p->nick, p, text); 00204 00205 /* Mark it as deleted so it doesn't get reused before it's free. */ 00206 p->flags |= PARTY_DELETED; 00207 garbage_add(partymember_cleanup, NULL, GARBAGE_ONCE); 00208 npartymembers--; 00209 00210 common = partychan_get_common(p); 00211 if (common) { 00212 for (i = 0; i < common->len; i++) { 00213 mem = common->members[i]; 00214 if (mem->flags & PARTY_DELETED) continue; 00215 if (mem->handler->on_quit) (mem->handler->on_quit)(mem->client_data, p, lost_bot, text, len); 00216 } 00217 partychan_free_common(common); 00218 } 00219 00220 /* Remove from any stray channels. */ 00221 for (i = 0; i < p->nchannels; i++) { 00222 partychan_part(p->channels[i], p, text); 00223 } 00224 p->nchannels = 0; 00225 00226 if (p->handler && p->handler->on_quit) { 00227 (p->handler->on_quit)(p->client_data, p, lost_bot, text, strlen(text)); 00228 } 00229 if (p->owner && p->owner->on_delete) p->owner->on_delete(p->owner, p->client_data); 00230 p->bot = NULL; 00231 return(0); 00232 }
int partymember_delete_by_bot | ( | const botnet_bot_t * | bot, | |
const botnet_bot_t * | lost_bot, | |||
const char * | reason | |||
) |
Deletes all users on a bot.
Deletes all partymembers on a certain bot.
bot | The bot the users are on or NULL for all users on this bot. | |
lost_bot | The bot that was really unlinked to cause this. | |
reason | Some kind of explanation why it happened. |
Definition at line 462 of file partymember.c.
References partymember::flags, partymember::next_on_bot, PARTY_DELETED, partymember_delete(), and botnet_bot::partys.
Referenced by botnet_recursive_delete().
00463 { 00464 int ret = 0; 00465 partymember_t *p; 00466 00467 for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) { 00468 if (p->flags & PARTY_DELETED) continue; 00469 partymember_delete(p, lost_bot, reason); 00470 ++ret; 00471 } 00472 return ret; 00473 }
int partymember_delete_by_owner | ( | struct egg_module * | module, | |
void * | script | |||
) |
Deletes all partymembers with a given owner.
Calls partymember_delete() for every partymember with a given owner.
module | The module whose partymembers should be deleted. | |
script | The script whose partymembers should be deleted. NULL matches everything. |
Definition at line 175 of file partymember.c.
References event_owner_b::client_data, partymember::flags, event_owner_b::module, partymember::next, NULL, partymember::owner, PARTY_DELETED, and partymember_delete().
Referenced by script_remove_events_by_owner().
00176 { 00177 int ret = 0; 00178 partymember_t *p; 00179 00180 for (p = party_head; p; p = p->next) { 00181 if (p->flags & PARTY_DELETED) continue; 00182 if (p->owner && p->owner->module == module && (!script || p->owner->client_data == script)) { 00183 partymember_delete(p, NULL, "Module unloaded"); 00184 ++ret; 00185 } 00186 } 00187 00188 return ret; 00189 }
partymember_t* partymember_get_head | ( | void | ) |
Definition at line 102 of file partymember.c.
Referenced by botnet_set_name().
00103 { 00104 return party_head; 00105 }
static int partymember_get_id | ( | botnet_bot_t * | bot | ) | [static] |
Definition at line 112 of file partymember.c.
References NULL, and partymember_lookup().
Referenced by partymember_new().
00113 { 00114 int id; 00115 00116 for (id = 1; partymember_lookup(NULL, bot, id); id++) { 00117 ; 00118 } 00119 return(id); 00120 }
partymember_t* partymember_get_local_head | ( | void | ) |
Definition at line 107 of file partymember.c.
Referenced by botnet_recursive_replay_net().
00108 { 00109 return local_party_head; 00110 }
int partymember_init | ( | void | ) |
Definition at line 40 of file partymember.c.
References bind_add_list(), BIND_STACKABLE, bind_table_add(), BT_new, BT_quit, BTN_PARTYLINE_NEW, BTN_PARTYLINE_NICK, BTN_PARTYLINE_QUIT, BTN_USER_DELETE, MATCH_MASK, and MATCH_NONE.
Referenced by partyline_init().
00041 { 00042 bind_add_list(BTN_USER_DELETE, partymember_udelete_binds); 00043 BT_nick = bind_table_add(BTN_PARTYLINE_NICK, 3, "Pss", MATCH_NONE, BIND_STACKABLE); 00044 BT_new = bind_table_add(BTN_PARTYLINE_NEW, 1, "P", MATCH_MASK, BIND_STACKABLE); 00045 BT_quit = bind_table_add(BTN_PARTYLINE_QUIT, 2, "Ps", MATCH_MASK, BIND_STACKABLE); 00046 return(0); 00047 }
int partymember_local_broadcast | ( | botnet_entity_t * | src, | |
const char * | text, | |||
int | len | |||
) |
Definition at line 358 of file partymember.c.
References partymember::flags, partymember::next_on_bot, PARTY_DELETED, and partymember_msg().
Referenced by botnet_broadcast().
00359 { 00360 partymember_t *p; 00361 00362 if (len < 0) len = strlen(text); 00363 for (p = local_party_head; p; p = p->next_on_bot) { 00364 if (p->flags & PARTY_DELETED) continue; 00365 partymember_msg(p, src, text, len); 00366 } 00367 return 0; 00368 }
partymember_t* partymember_lookup | ( | const char * | full_name, | |
botnet_bot_t * | bot, | |||
int | id | |||
) |
Definition at line 287 of file partymember.c.
References botnet_get_name(), botnet_lookup(), partymember::flags, partymember::id, botnet_bot::name, partymember::next_on_bot, partymember::nick, NULL, PARTY_DELETED, and botnet_bot::partys.
Referenced by get_entity(), got_actchan(), got_away(), got_chat(), got_join(), got_nickchange(), got_part(), got_privmsg(), got_versions(), on_putlog(), party_whisper(), party_who(), partymember_get_id(), perl_to_c_var(), tcl_to_c_var(), and user_change_handle().
00288 { 00289 int i = id; 00290 char *name = NULL; 00291 const char *ptr, *nick = full_name; 00292 botnet_bot_t *b = bot; 00293 partymember_t *p; 00294 00295 if (!full_name && id == -1) return NULL; 00296 00297 if (full_name) { 00298 ptr = strchr(full_name, '@'); 00299 if (ptr) { 00300 bot = botnet_lookup(ptr + 1); 00301 if (!bot && strcmp(ptr + 1, botnet_get_name())) return NULL; 00302 if (b && bot != b) return NULL; 00303 name = strdup(full_name); 00304 name[ptr - full_name] = 0; 00305 nick = name; 00306 } 00307 00308 ptr = strchr(nick, ':'); 00309 if (ptr) { 00310 id = atoi(nick); 00311 if (i != -1 && i != id) { 00312 if (name) free(name); 00313 return NULL; 00314 } 00315 nick = ptr + 1; 00316 } 00317 } 00318 00319 for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) { 00320 if (p->flags & PARTY_DELETED) continue; 00321 if (id != -1) { 00322 if (p->id == id) break; 00323 } else { 00324 if (!strcmp(p->nick, nick)) break; 00325 } 00326 } 00327 00328 if (p && id != -1 && nick && strcmp(p->nick, nick)) p = NULL; 00329 if (name) free(name); 00330 return p; 00331 }
int partymember_msg | ( | partymember_t * | p, | |
botnet_entity_t * | src, | |||
const char * | text, | |||
int | len | |||
) |
Definition at line 346 of file partymember.c.
References partymember::bot, botnet_bot::client_data, partymember::client_data, botnet_bot::direction, partymember::flags, botnet_bot::handler, partymember::handler, botnet_handler_t::on_privmsg, partyline_event::on_privmsg, and PARTY_DELETED.
Referenced by botnet_link(), got_privmsg(), party_whisper(), partymember_local_broadcast(), partymember_msgf(), and partymember_write().
00347 { 00348 if (!p || p->flags & PARTY_DELETED) return(-1); 00349 00350 if (len < 0) len = strlen(text); 00351 if (p->handler && p->handler->on_privmsg) 00352 p->handler->on_privmsg(p->client_data, p, src, text, len); 00353 else if (p->bot && p->bot->direction->handler && p->bot->direction->handler->on_privmsg) 00354 p->bot->direction->handler->on_privmsg(p->bot->direction->client_data, src, p, text, len); 00355 return 0; 00356 }
int partymember_msgf | ( | partymember_t * | p, | |
botnet_entity_t * | src, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 402 of file partymember.c.
References egg_mvsprintf(), and partymember_msg().
Referenced by botnet_unlink().
00403 { 00404 va_list args; 00405 char *ptr, buf[1024]; 00406 int len; 00407 00408 va_start(args, fmt); 00409 ptr = egg_mvsprintf(buf, sizeof(buf), &len, fmt, args); 00410 va_end(args); 00411 00412 partymember_msg(p, src, ptr, len); 00413 00414 if (ptr != buf) free(ptr); 00415 return(0); 00416 }
partymember_t* partymember_new | ( | int | id, | |
user_t * | user, | |||
botnet_bot_t * | bot, | |||
const char * | nick, | |||
const char * | ident, | |||
const char * | host, | |||
partyline_event_t * | handler, | |||
void * | client_data, | |||
event_owner_t * | owner | |||
) |
Definition at line 122 of file partymember.c.
References b64enc_int(), bind_check(), partymember::bot, botnet_announce_login(), botnet_get_name(), BT_new, partymember::client_data, partymember::common_name, egg_mprintf(), user::flags, partymember::full_id_name, partymember::full_name, partymember::handler, partymember::host, partymember::id, partymember::ident, botnet_bot::name, partymember::net_name, partymember::next, partymember::next_on_bot, partymember::nick, npartymembers, NULL, partymember::owner, partymember_get_id(), botnet_bot::partys, partymember::prev, partymember::prev_on_bot, partymember::user, and USER_BOT.
Referenced by dcc_on_read(), get_entity(), got_join(), got_login(), got_versions(), irc_on_read(), telnet_on_read(), and terminal_init().
00123 { 00124 partymember_t *mem; 00125 00126 if (user && user->flags & USER_BOT) return NULL; 00127 mem = calloc(1, sizeof(*mem)); 00128 if (id == -1) id = partymember_get_id(bot); 00129 mem->id = id; 00130 mem->user = user; 00131 mem->bot = bot; 00132 mem->nick = strdup(nick); 00133 mem->ident = strdup(ident); 00134 mem->host = strdup(host); 00135 mem->net_name = egg_mprintf("%s@%s", b64enc_int(id), bot ? bot->name : botnet_get_name()); 00136 mem->full_id_name = egg_mprintf("%d:%s@%s", id, nick, bot ? bot->name : botnet_get_name()); 00137 mem->full_name = strchr(mem->full_id_name, ':') + 1; 00138 mem->common_name = bot ? mem->full_name : mem->nick; 00139 mem->handler = handler; 00140 mem->client_data = client_data; 00141 mem->owner = owner; 00142 00143 mem->next = party_head; 00144 if (party_head) party_head->prev = mem; 00145 party_head = mem; 00146 00147 mem->prev_on_bot = NULL; 00148 if (bot) { 00149 mem->next_on_bot = bot->partys; 00150 if (bot->partys) bot->partys->prev_on_bot = mem; 00151 bot->partys = mem; 00152 } else { 00153 mem->next_on_bot = local_party_head; 00154 if (local_party_head) local_party_head->prev_on_bot = mem; 00155 local_party_head = mem; 00156 } 00157 00158 npartymembers++; 00159 botnet_announce_login(mem); 00160 bind_check(BT_new, NULL, nick, mem); 00161 return(mem); 00162 }
int partymember_printf | ( | partymember_t * | p, | |
const char * | fmt, | |||
... | ||||
) |
Definition at line 386 of file partymember.c.
References egg_mvsprintf(), and partymember_write().
Referenced by callback_match_attr(), callback_match_ircmask(), Log(), lookup_setting(), party_act(), party_binds(), party_bots(), party_chaninfo(), party_chanmembermode(), party_channels(), party_chanset(), party_chattr(), party_chhandle(), party_chpass(), party_dump(), party_get(), party_help(), party_join(), party_jump(), party_link(), party_loadmod(), party_match(), party_matchattr(), party_matchwild(), party_minus_bot(), party_minus_chan(), party_minus_host(), party_minus_obot(), party_minus_server(), party_minus_user(), party_modules(), party_msg(), party_newpass(), party_pls_chan(), party_plus_bot(), party_plus_host(), party_plus_obot(), party_plus_server(), party_plus_user(), party_quit(), party_servers(), party_set(), party_status(), party_tcl(), party_timers(), party_unlink(), party_unloadmod(), party_unset(), party_whisper(), party_who(), party_whois(), partyline_on_command(), print_net(), and server_status().
00387 { 00388 va_list args; 00389 char *ptr, buf[1024]; 00390 int len; 00391 00392 va_start(args, fmt); 00393 ptr = egg_mvsprintf(buf, sizeof(buf), &len, fmt, args); 00394 va_end(args); 00395 00396 partymember_write(p, ptr, len); 00397 00398 if (ptr != buf) free(ptr); 00399 return(0); 00400 }
static void partymember_really_delete | ( | partymember_t * | p | ) | [static] |
Definition at line 65 of file partymember.c.
References partymember::bot, partymember::channels, partymember::full_id_name, partymember::host, partymember::ident, partymember::net_name, partymember::next, partymember::next_on_bot, partymember::nick, botnet_bot::partys, partymember::prev, and partymember::prev_on_bot.
Referenced by partymember_cleanup().
00066 { 00067 /* Get rid of it from the main list and the local list. */ 00068 if (p->prev) p->prev->next = p->next; 00069 else party_head = p->next; 00070 if (p->next) p->next->prev = p->prev; 00071 00072 if (p->prev_on_bot) p->prev_on_bot->next_on_bot = p->next_on_bot; 00073 else if (p->bot) p->bot->partys = p->next_on_bot; 00074 else if (local_party_head == p) local_party_head = p->next_on_bot; 00075 if (p->next_on_bot) p->next_on_bot->prev_on_bot = p->prev_on_bot; 00076 00077 /* Free! */ 00078 free(p->nick); 00079 if (p->ident) free(p->ident); 00080 if (p->host) free(p->host); 00081 free(p->net_name); 00082 free(p->full_id_name); 00083 if (p->channels) free(p->channels); 00084 00085 /* Zero it out in case anybody has kept a reference (bad!). */ 00086 memset(p, 0, sizeof(*p)); 00087 00088 free(p); 00089 }
int partymember_set_nick | ( | partymember_t * | p, | |
const char * | nick | |||
) |
Definition at line 234 of file partymember.c.
References bind_check(), botnet_set_nick(), partymember::client_data, partymember::flags, partymember::handler, partymember_common::len, partymember_common::members, partymember::nick, NULL, partyline_event::on_nick, PARTY_DELETED, PARTY_SELECTED, partychan_free_common(), and partychan_get_common().
Referenced by got_nick(), got_nickchange(), and user_change_handle().
00235 { 00236 partymember_common_t *common; 00237 partymember_t *mem; 00238 char *oldnick; 00239 int i; 00240 00241 oldnick = p->nick; 00242 p->nick = strdup(nick); 00243 if (p->handler && p->handler->on_nick) 00244 (p->handler->on_nick)(p->client_data, p, oldnick, nick); 00245 botnet_set_nick(p, oldnick); 00246 p->flags |= PARTY_SELECTED; 00247 common = partychan_get_common(p); 00248 if (common) { 00249 for (i = 0; i < common->len; i++) { 00250 mem = common->members[i]; 00251 if (mem->flags & PARTY_DELETED) continue; 00252 if (mem->handler->on_nick) (mem->handler->on_nick)(mem->client_data, p, oldnick, nick); 00253 } 00254 partychan_free_common(common); 00255 } 00256 bind_check(BT_nick, NULL, NULL, p, oldnick, p->nick); 00257 if (oldnick) free(oldnick); 00258 p->flags &= ~PARTY_SELECTED; 00259 return(0); 00260 }
int partymember_shutdown | ( | void | ) |
Definition at line 49 of file partymember.c.
References _, bind_rem_list(), bind_table_del(), BT_new, BT_quit, BTN_USER_DELETE, garbage_run(), NULL, and partymember_delete().
Referenced by partyline_shutdown().
00050 { 00051 while (party_head) partymember_delete(party_head, NULL, _("Bot shutdown")); 00052 bind_rem_list(BTN_USER_DELETE, partymember_udelete_binds); 00053 bind_table_del(BT_nick); 00054 bind_table_del(BT_new); 00055 bind_table_del(BT_quit); 00056 00057 /* force a garbage run since we might have some partymembers 00058 * marked as deleted and w/o a garbage_run we may not destroy 00059 * our hashtable */ 00060 garbage_run(); 00061 00062 return (0); 00063 }
int partymember_update_info | ( | partymember_t * | p, | |
const char * | ident, | |||
const char * | host | |||
) |
Definition at line 262 of file partymember.c.
References partymember::host, partymember::ident, and str_redup().
00263 { 00264 if (!p) return(-1); 00265 if (ident) str_redup(&p->ident, ident); 00266 if (host) str_redup(&p->host, host); 00267 return(0); 00268 }
int partymember_who | ( | int ** | ids, | |
int * | len | |||
) |
Definition at line 270 of file partymember.c.
References partymember::flags, partymember::id, partymember::next_on_bot, npartymembers, and PARTY_DELETED.
Referenced by party_who().
00271 { 00272 int i; 00273 partymember_t *p; 00274 00275 *ids = malloc(sizeof(int) * (npartymembers+1)); 00276 i = 0; 00277 for (p = local_party_head; p; p = p->next_on_bot) { 00278 if (p->flags & PARTY_DELETED) continue; 00279 (*ids)[i] = p->id; 00280 i++; 00281 } 00282 (*ids)[i] = 0; 00283 *len = i; 00284 return(0); 00285 }
int partymember_write | ( | partymember_t * | p, | |
const char * | text, | |||
int | len | |||
) |
Definition at line 341 of file partymember.c.
References NULL, and partymember_msg().
Referenced by party_perl(), party_python(), party_tcl(), and partymember_printf().
00342 { 00343 return partymember_msg(p, NULL, text, len); 00344 }
bind_table_t * BT_new = NULL [static] |
Definition at line 38 of file partymember.c.
Referenced by partymember_init(), partymember_new(), and partymember_shutdown().
bind_table_t* BT_nick = NULL [static] |
Definition at line 38 of file partymember.c.
bind_table_t * BT_quit = NULL [static] |
Definition at line 38 of file partymember.c.
partymember_t* local_party_head = NULL [static] |
Definition at line 27 of file partymember.c.
int npartymembers = 0 [static] |
Definition at line 28 of file partymember.c.
Referenced by partymember_delete(), partymember_new(), and partymember_who().
partymember_t* party_head = NULL [static] |
Definition at line 26 of file partymember.c.
bind_list_t partymember_udelete_binds[] [static] |
const char rcsid[] = "$Id: partymember.c,v 1.31 2007-09-13 22:20:55 sven Exp $" [static] |
Definition at line 21 of file partymember.c.