-static IRC_CMD(raw_kick) {
- if(from == NULL || argc < 3) return 0;
- SYNCHRONIZE(cache_sync);
- struct UserNode *user = getUserByMask(from);
- struct UserNode *target = getUserByNick(argv[1]);
- struct ChanNode *chan = getChanByName(argv[0]);
- if(chan == NULL || target == NULL) {
- DESYNCHRONIZE(cache_sync);
- return 0;
- }
- if(((!isBot(target) && chan->chanbot != client->user) || (isBot(target) && client->user != target))) {
- DESYNCHRONIZE(cache_sync);
- return 1; //we ignore it - but it's not a parse error
- }
- int keep_channel = 1;
- if(isUserOnChan(target, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
- if(user == NULL) {
- user = createTempUserMask(from);
- if(!user) {
- DESYNCHRONIZE(cache_sync);
- return 0;
- }
- user->flags |= USERFLAG_ISTMPUSER;
- }
- struct ChanUser *chanuser = getChanUser(target, chan);
- delChanUser(chanuser, 0); //we need to free the chanuser manually!
- event_kick(user, chanuser, argv[1]);
- if(chanuser->chan->chanbot == user) {
- //check if theres another bot in the channel - otherwise free it
- keep_channel = checkChannelVisibility(chan);
- }
- freeChanUser(chanuser);
- }
- if(target->channel == NULL && !(target->flags & USERFLAG_ISBOT)) {
- //remove the user
- delUser(target, 1);
- }
- if(keep_channel && (chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chan->flags & CHANFLAG_REJOINING)) {
- check_full_rejoin(chan);
+static struct ClientSocket *get_first_prefered_bot_in_channel(struct ChanNode *chan) {
+ struct ClientSocket *bot, *chanbot = NULL;
+ for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
+ if(!isUserOnChan(bot->user, chan))
+ continue;
+ if(bot->flags & SOCKET_FLAG_PREFERRED)
+ return bot;
+ chanbot = bot;