Files
energymech/src/net_chan.c
2014-03-08 19:56:21 -05:00

145 lines
3.1 KiB
C

/*
EnergyMech, IRC bot software
Copyright (c) 1997-2004 proton
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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define NET_C
#include "config.h"
#ifdef BOTNET
#include "defines.h"
#include "structs.h"
#include "global.h"
#include "h.h"
#include "text.h"
#include "mcmd.h"
ChanUser *find_chanbot(Chan *chan, char *nick)
{
ChanUser *cu;
if (chan->cacheuser && !nickcmp(nick,chan->cacheuser->nick)
&& chan->cacheuser->user && chan->cacheuser->user->x.x.access == BOTLEVEL)
return(chan->cacheuser);
for(cu=chan->users;cu;cu=cu->next)
{
if (cu->user && cu->user->x.x.access == BOTLEVEL)
{
if (!nickcmp(nick,cu->nick))
return(chan->cacheuser = cu);
}
}
return(NULL);
}
void check_botjoin(Chan *chan, ChanUser *cu)
{
BotNet *bn;
BotInfo *binfo;
#ifdef DEBUG
debug("(check_botjoin) chan = %s; cu = %s!%s\n",chan->name,cu->nick,cu->userhost);
#endif /* DEBUG */
for(bn=botnetlist;bn;bn=bn->next)
{
if (bn->status != BN_LINKED)
continue;
for(binfo=bn->botinfo;binfo;binfo=binfo->next)
{
if (!nickcmp(cu->nick,binfo->nuh) &&
!Strcasecmp(cu->userhost,getuh(binfo->nuh)))
{
if ((cu = find_chanbot(chan,binfo->nuh)) == NULL)
return;
cu->flags |= CU_NEEDOP;
send_mode(chan,50,QM_CHANUSER,'+','o',(void*)cu);
#ifdef DEBUG
debug("(check_botjoin) CU_NEEDOP set, mode pushed\n");
#endif /* DEBUG */
return;
}
}
}
}
void check_botinfo(BotInfo *binfo, const char *channel)
{
Chan *chan;
ChanUser *cu;
Mech *backup;
char *userhost;
userhost = getuh(binfo->nuh);
backup = current;
for(current=botlist;current;current=current->next)
{
for(chan=current->chanlist;chan;chan=chan->next)
{
if (channel && Strcasecmp(channel,chan->name))
continue;
if ((cu = find_chanbot(chan,binfo->nuh)) == NULL)
continue;
if (!Strcasecmp(cu->userhost,userhost))
{
cu->flags |= CU_NEEDOP;
send_mode(chan,50,QM_CHANUSER,'+','o',(void*)cu);
}
}
}
current = backup;
}
/*
*
* protocol routines
*
*/
void netchanNeedop(BotNet *source, char *rest)
{
BotNet *bn;
BotInfo *binfo;
char *channel;
int guid;
guid = a2i(chop(&rest));
channel = chop(&rest);
if (errno || guid < 1 || !channel)
return;
botnet_relay(source,"CO%i %s\n",guid,channel);
for(bn=botnetlist;bn;bn=bn->next)
{
if (bn->status != BN_LINKED)
continue;
for(binfo=bn->botinfo;binfo;binfo=binfo->next)
{
if (binfo->guid == guid)
check_botinfo(binfo,channel);
}
}
}
#endif /* BOTNET */