bs_assign.c

Go to the documentation of this file.
00001 /* BotServ core functions
00002  *
00003  * (C) 2003-2013 Anope Team
00004  * Contact us at team@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  *
00012  */
00013 /*************************************************************************/
00014 
00015 #include "module.h"
00016 
00017 static int do_assign(User * u);
00018 static void myBotServHelp(User * u);
00019 
00026 int AnopeInit(int argc, char **argv)
00027 {
00028     Command *c;
00029 
00030     moduleAddAuthor("Anope");
00031     moduleAddVersion(VERSION_STRING);
00032     moduleSetType(CORE);
00033     c = createCommand("ASSIGN", do_assign, NULL, BOT_HELP_ASSIGN, -1, -1,
00034                       -1, -1);
00035     moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
00036 
00037     moduleSetBotHelp(myBotServHelp);
00038 
00039     return MOD_CONT;
00040 }
00041 
00045 void AnopeFini(void)
00046 {
00047 
00048 }
00049 
00050 
00055 static void myBotServHelp(User * u)
00056 {
00057     notice_lang(s_BotServ, u, BOT_HELP_CMD_ASSIGN);
00058 }
00059 
00065 static int do_assign(User * u)
00066 {
00067     char *chan = strtok(NULL, " ");
00068     char *nick = strtok(NULL, " ");
00069     BotInfo *bi;
00070     ChannelInfo *ci;
00071 
00072     if (readonly)
00073         notice_lang(s_BotServ, u, BOT_ASSIGN_READONLY);
00074     else if (!chan || !nick)
00075         syntax_error(s_BotServ, u, "ASSIGN", BOT_ASSIGN_SYNTAX);
00076     else if (!(bi = findbot(nick)))
00077         notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, nick);
00078     else if (bi->flags & BI_PRIVATE && !is_oper(u))
00079         notice_lang(s_BotServ, u, PERMISSION_DENIED);
00080     else if (!(ci = cs_findchan(chan)))
00081         notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
00082     else if ((ci->botflags & BS_NOBOT)
00083              || (!check_access(u, ci, CA_ASSIGN) && !is_services_admin(u)))
00084         notice_lang(s_BotServ, u, PERMISSION_DENIED);
00085     else if (ci->flags & CI_VERBOTEN)
00086         notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
00087     else if ((ci->bi) && (stricmp(ci->bi->nick, nick) == 0))
00088         notice_lang(s_BotServ, u, BOT_ASSIGN_ALREADY, ci->bi->nick, chan);
00089     else {
00090         if (ci->bi)
00091             unassign(u, ci);
00092         ci->bi = bi;
00093         bi->chancount++;
00094         if (ci->c && ci->c->usercount >= BSMinUsers) {
00095             bot_join(ci);
00096         }
00097         alog("%s: %s!%s@%s assigned bot %s to %s", s_BotServ, u->nick, u->username,
00098              u->host, bi->nick, ci->name);
00099         notice_lang(s_BotServ, u, BOT_ASSIGN_ASSIGNED, bi->nick, ci->name);
00100         send_event(EVENT_BOT_ASSIGN, 2, ci->name, bi->nick);
00101     }
00102     return MOD_CONT;
00103 }