From bf9e66fd27671379903a4870b28380a85ea5d31d Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 5 Oct 2011 13:27:13 +0200 Subject: [PATCH] added event_kick --- src/bot_NeonServ.c | 3 +- src/event_neonserv_kick.c | 74 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/event_neonserv_kick.c diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index d9305c1..f8b7c04 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -331,7 +331,7 @@ cmd_neonserv_calc.c #include "event_neonserv_join.c" #include "event_neonserv_part.c" #include "event_neonserv_quit.c" -//#include "event_neonserv_kick.c" +#include "event_neonserv_kick.c" #include "event_neonserv_mode.c" #include "event_neonserv_ctcp.c" #include "event_neonserv_notice.c" @@ -545,6 +545,7 @@ void init_NeonServ() { bind_topic(neonserv_event_topic); bind_invite(neonserv_event_invite); bind_mode(neonserv_event_mode); + bind_kick(neonserv_event_kick); set_trigger_callback(BOTID, neonserv_trigger_callback); diff --git a/src/event_neonserv_kick.c b/src/event_neonserv_kick.c new file mode 100644 index 0000000..d4783bb --- /dev/null +++ b/src/event_neonserv_kick.c @@ -0,0 +1,74 @@ +/* event_neonserv_kick.c - NeonServ v5.0 + * Copyright (C) 2011 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +struct neonserv_event_kick_cache { + struct ClientSocket *client; + struct UserNode *user; + struct ChanUser *target; + int userauth_pending; +}; + +static USERAUTH_CALLBACK(neonserv_event_kick_nick_lookup); +static void neonserv_event_kick_async1(struct neonserv_event_kick_cache *cache); +static void neonserv_event_kick_async2(struct ClientSocket *client, struct UserNode *user, struct ChanUser *target); + +static void neonserv_event_kick(struct UserNode *user, struct ChanUser *target, char *reason) { + struct ClientSocket *client = getBotForChannel(chan); + if(!client) return; //we can't "see" this event + if(isNetworkService(user)) return; + loadChannelSettings(chan); + if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return; + struct neonserv_event_kick_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->user = user; + cache->target = target; + cache->userauth_pending++; + if(!(user->flags & USERFLAG_ISAUTHED)) { + get_userauth(user, neonserv_event_kick_nick_lookup, cache); + cache->userauth_pending++; + } + if(!(chanuser->user->flags & USERFLAG_ISAUTHED)) { + get_userauth(chanuser->user, neonserv_event_kick_nick_lookup, cache); + cache->userauth_pending++; + } + neonserv_event_kick_async1(cache); +} + +static USERAUTH_CALLBACK(neonserv_event_kick_nick_lookup) { + struct neonserv_event_kick_cache *cache = data; + cache->userauth_pending--; + neonserv_event_kick_async1(cache); +} + +static void neonserv_event_kick_async1(struct neonserv_event_kick_cache *cache) { + if(cache->userauth_pending == 0) { + neonserv_event_kick_async2(cache->client, cache->user, cache->chanuser); + free(cache); + } +} + +static void neonserv_event_kick_async2(struct ClientSocket *client, struct UserNode *user, struct ChanUser *target) { + if(isUserProtected(target->chan, target->user, user)) { + char buf[MAXLEN]; + putsock(client, "KICK %s %s :%s", target->chan->name, user->nick, build_language_string(user, buf, "NS_USER_PROTECTED", target->user->nick)); + putsock(client, "INVITE %s %s", target->user->nick, target->chan->name); + } +} -- 2.20.1