admin.cpp

Go to the documentation of this file.
00001 /*
00002 #########################################################################
00003 #
00004 #  This file is part of trustyRC.
00005 #
00006 #  trustyRC, fully modular IRC robot 
00007 #  Copyright (C) 2006-2008 Nicoleau Fabien 
00008 #
00009 #  trustyRC is free software: you can redistribute it and/or modify
00010 #  it under the terms of the GNU General Public License as published by
00011 #  the Free Software Foundation, either version 3 of the License, or
00012 #  (at your option) any later version.
00013 #
00014 #  trustyRC is distributed in the hope that it will be useful,
00015 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 #  GNU General Public License for more details.
00018 #
00019 #  You should have received a copy of the GNU General Public License
00020 #  along with trustyRC.  If not, see <http://www.gnu.org/licenses/>.
00021 #
00022 #########################################################################
00023 */
00024 
00029 #include "admin.h"
00030 
00034 Admin::Admin(BotKernel*b)
00035 {
00036         this->author = "eponyme";
00037         this->description = "bot admin management";
00038         this->version = VERSION;
00039         this->name = "admin";
00040         this->bindFunction("addsuperadmin",IN_COMMAND_HANDLER,"addsuperadmin",0,10);
00041         this->bindFunction("addtempsuperadmin",IN_COMMAND_HANDLER,"addtempsuperadmin",0,10);
00042         this->bindFunction("superadminlist",IN_COMMAND_HANDLER,"superadminlist",0,10);
00043         this->bindFunction("setsuperadminpass",IN_COMMAND_HANDLER,"setSuperAdminPass",0,10);
00044         this->bindFunction("35",IN_LOOP,"clearTemporaryAdmins",0,30); 
00045         this->bindFunction("delsuperadmin",IN_COMMAND_HANDLER,"delsuperadmin",0,10);
00046         this->bindFunction("reset",IN_COMMAND_HANDLER,"reset",0,10);
00047         this->bindFunction("disconnect",IN_COMMAND_HANDLER,"disconnect",0,10);
00048         this->bindFunction("getconfvalue",IN_COMMAND_HANDLER,"getconfvalue",0,10);
00049         this->bindFunction("setconfvalue",IN_COMMAND_HANDLER,"setconfvalue",0,10);
00050         this->bindFunction("deletekey",IN_COMMAND_HANDLER,"deletekey",0,10);
00051         this->bindFunction("loadconffile",IN_COMMAND_HANDLER,"loadconffile",0,10);
00052         this->bindFunction("flushconffile",IN_COMMAND_HANDLER,"flushconffile",0,10);
00053         this->bindFunction("addonlyon",IN_COMMAND_HANDLER,"addOnlyon",0,10);
00054         this->bindFunction("delonlyon",IN_COMMAND_HANDLER,"delOnlyon",0,10);
00055         this->bindFunction("enable",IN_COMMAND_HANDLER,"enable",0,10);
00056         this->bindFunction("disable",IN_COMMAND_HANDLER,"disable",0,10);
00057         this->bindFunction("commandsstatus",IN_COMMAND_HANDLER,"commandsStatus",0,10);
00058         this->bindFunction("",IN_BEFORE_TREATMENT,"allowedCommandCheck",0,10);
00059         this->bindFunction("chanlev",IN_COMMAND_HANDLER,"chanlev",0,10);
00060         this->bindFunction("join",IN_COMMAND_HANDLER,"joinChannel",0,10);
00061         this->bindFunction("part",IN_COMMAND_HANDLER,"leaveChannel",0,10);
00062         this->bindFunction("cycle",IN_COMMAND_HANDLER,"cycleChannel",0,10);
00063         this->bindFunction("setnick",IN_COMMAND_HANDLER,"setNick",0,10);
00064         this->bindFunction("tell",IN_COMMAND_HANDLER,"tell",0,10);
00065         this->bindFunction("notice",IN_COMMAND_HANDLER,"notice",0,10);
00066         this->bindFunction("raw",IN_COMMAND_HANDLER,"raw",0,10);
00067         this->bindFunction("whoami",IN_COMMAND_HANDLER,"whoami",0,10);
00068         this->bindFunction("reauth",IN_COMMAND_HANDLER,"reauth",0,10);
00069         this->bindFunction("INVITE",IN_TYPE_HANDLER,"onInvite",0,10);
00070         this->bindFunction("ERROR",IN_FIRST_WORD,"error",0,10);
00071         this->bindFunction("setloglevel",IN_COMMAND_HANDLER,"setloglevel",0,10);
00072         this->bindFunction("setlogkeepfiles",IN_COMMAND_HANDLER,"setlogkeepfiles",0,10);
00073         this->bindFunction("setlogperiod",IN_COMMAND_HANDLER,"setlogperiod",0,10);
00074         this->bindFunction("getnbcountdowns",IN_COMMAND_HANDLER,"getnbcountdowns",0,10);
00075         this->bindFunction("clearCountDowns",IN_COMMAND_HANDLER,"clearCountDowns",0,10);
00076    this->doc = new TiXmlDocument(b->getDatasDir()+"admin.xml");
00077    if ( this->doc->LoadFile() )
00078    {
00079       this->root = this->doc->FirstChild();
00080    }
00081    else
00082    {
00083       this->initFile();
00084    }
00085 }
00086 
00090 void Admin::initFile()
00091 {
00092    TiXmlElement born("trustyrc_access");
00093    this->doc->InsertEndChild(born);
00094    this->root = this->doc->FirstChild();
00095    TiXmlElement channelsNode( "channels" );
00096    this->root->InsertEndChild(channelsNode);
00097    TiXmlElement superAdminsNode("super_admins" );
00098    this->root->InsertEndChild(superAdminsNode);  
00099    TiXmlElement disableNode("disabled_commands" );
00100    this->root->InsertEndChild(disableNode); 
00101    TiXmlElement onlyonNode("onlyon_commands" );
00102    this->root->InsertEndChild(onlyonNode); 
00103    this->doc->SaveFile();
00104 }
00105 
00111 bool Admin::addChannel(string channel)
00112 {
00113    if(this->channelExists(channel)) {
00114       return false;
00115    }
00116    else {
00117       TiXmlElement elem("channel");
00118       elem.SetAttribute("name",Tools::to_lower(channel));
00119       this->root->FirstChild("channels")->InsertEndChild(elem) ;
00120       this->doc->SaveFile();
00121       return true;
00122    }
00123 }
00124 
00130 bool Admin::delChannel(string channel)
00131 {
00132    bool back=false;
00133    TiXmlElement * elem;
00134    elem = this->root->FirstChild("channels")->FirstChildElement();
00135    while ( elem != NULL )
00136    {
00137       if ( Tools::to_lower(elem->Attribute("name")) == Tools::to_lower(channel) )
00138       {
00139          back = this->root->FirstChild("channels")->RemoveChild(elem) ;
00140          this->doc->SaveFile();
00141          return back;
00142       }
00143       elem = elem->NextSiblingElement();
00144    }
00145    return back;
00146 }
00147 
00153 bool Admin::channelExists(string channel)
00154 {
00155    TiXmlElement * elem;
00156    elem = this->root->FirstChild("channels")->FirstChildElement();
00157    while ( elem != NULL )
00158    {
00159       if ( Tools::to_lower(elem->Attribute("name")) == Tools::to_lower(channel) )
00160          return true;
00161       elem = elem->NextSiblingElement();
00162    }
00163    return false;
00164 }
00165 
00171 bool Admin::addSuperAdmin(string mask)
00172 {
00173    if(this->isSuperAdmin(mask)) {
00174       return false;
00175    }
00176    else {
00177       TiXmlElement elem("admin");
00178       elem.SetAttribute("mask",Tools::to_lower(mask));
00179       elem.SetAttribute("temp","0");
00180       this->root->FirstChild("super_admins")->InsertEndChild(elem) ;
00181       this->doc->SaveFile();
00182       return true;
00183    }
00184 }
00185 
00192 bool Admin::addTempSuperAdmin(string mask,unsigned int duration)
00193 {
00194    time_t now;
00195         time(&now);
00196    if(this->isSuperAdmin(mask)) {
00197       return false;
00198    }
00199    else {
00200       TiXmlElement elem("admin");
00201       elem.SetAttribute("mask",Tools::to_lower(mask));
00202       elem.SetAttribute("temp","1");
00203       elem.SetAttribute("timeout",duration+now);
00204       this->root->FirstChild("super_admins")->InsertEndChild(elem) ;
00205       this->doc->SaveFile();
00206       return true;
00207    }
00208 }
00209 
00215 bool Admin::delSuperAdmin(unsigned int index)
00216 {
00217    bool result;
00218    TiXmlHandle docHandle (this->doc);
00219    TiXmlNode * parent ;
00220    TiXmlElement * elem = docHandle.FirstChild("trustyrc_access").FirstChild("super_admins").Child(index).Element();
00221    if(elem) {
00222       parent = elem->Parent();
00223       result = parent->RemoveChild(elem);
00224       this->doc->SaveFile();
00225       return result;
00226    }
00227    return false;
00228 }
00229 
00235 bool Admin::isSuperAdmin(string mask)
00236 {
00237    TiXmlElement * elem;
00238    elem = this->root->FirstChild("super_admins")->FirstChildElement();
00239    while ( elem != NULL )
00240    {
00241       if(Tools::ircMaskMatch(Tools::to_lower(mask),Tools::to_lower(elem->Attribute("mask")) ))
00242          return true;
00243       elem = elem->NextSiblingElement();
00244    }
00245    return false;
00246 }
00247 
00253 bool Admin::maskIsSuperAdmin(string mask)
00254 {
00255    TiXmlElement * elem;
00256    string admMask;
00257    mask = Tools::to_lower(mask);
00258    string nick1,nick2,ident1,ident2,host1,host2;
00259    nick1 = mask.substr(0,mask.find("!"));
00260    ident1 = mask.substr(mask.find("!")+1,mask.find("@")-mask.find("!")-1); 
00261    host1 = mask.substr(mask.find("@")+1) ;
00262    elem = this->root->FirstChild("super_admins")->FirstChildElement();
00263    while ( elem != NULL )
00264    {
00265       admMask = Tools::to_lower(elem->Attribute("mask")) ;
00266       nick2 = admMask.substr(0,admMask.find("!"));
00267       ident2 = admMask.substr(admMask.find("!")+1,admMask.find("@")-admMask.find("!")-1);
00268       host2 = admMask.substr(admMask.find("@")+1) ;
00269       if((Tools::masksMatch((char*)nick1.c_str(),(char*)nick2.c_str())==1)&&(Tools::masksMatch((char*)ident1.c_str(),(char*)ident2.c_str())==1)&&(Tools::masksMatch((char*)host1.c_str(),(char*)host2.c_str())==1))
00270          return true;
00271       elem = elem->NextSiblingElement();
00272    }
00273    return false;
00274 }
00275 
00280 vector<string> Admin::superAdminList()
00281 {
00282    time_t futur;
00283         char date[17];
00284    vector<string> back;
00285    unsigned int i = 0 ;
00286    back.clear();
00287    TiXmlHandle docHandle (this->doc);
00288    TiXmlElement * elem = docHandle.FirstChild("trustyrc_access").FirstChild("super_admins").Element();
00289    if (elem) {
00290       for (elem=elem->FirstChildElement() ; elem!=0;elem=elem->NextSiblingElement() ) {
00291          if ( (string)elem->Attribute("temp") == "1" ) {
00292             futur = Tools::strToInt(elem->Attribute("timeout")) ;
00293             strftime(date,18,"%y-%m-%d %X",localtime(&futur));
00294             back.push_back("#"+Tools::intToStr(i)+":"+elem->Attribute("mask")+" (to "+(string)date+")");
00295          }
00296          else {
00297             back.push_back("#"+Tools::intToStr(i)+":"+elem->Attribute("mask"));
00298          }
00299          i++;
00300       }
00301    }
00302    return back;
00303 }
00304 
00308 void Admin::clearTempAdmins()
00309 {
00310    time_t now;
00311    time(&now);
00312    TiXmlHandle docHandle (this->doc);
00313    TiXmlElement * elem = docHandle.FirstChild("trustyrc_access").FirstChild("super_admins").Element();
00314    if (elem) {
00315       for (elem=elem->FirstChildElement() ; elem!=0;elem=elem->NextSiblingElement() ) {
00316          if ( (string)elem->Attribute("temp")=="1" ) {
00317             if ( Tools::strToInt(elem->Attribute("timeout"))<now ) {
00318                elem->Parent()->RemoveChild(elem);
00319             }
00320          }
00321       }   
00322       this->doc->SaveFile();
00323    }
00324 }
00325 
00333 bool Admin::addUser(string channel,string mask,unsigned int level)
00334 {
00335    channel = Tools::to_lower(channel);
00336    mask = Tools::to_lower(mask);
00337    TiXmlElement * elem;
00338    if ( (this->userExists(channel,mask)) || (level<1) || (level>4) )
00339    {
00340       return false;
00341    }
00342    else
00343    {
00344       if (!this->channelExists(channel) )
00345       {
00346          this->addChannel(channel);
00347       }
00348       elem = this->root->FirstChild("channels")->FirstChildElement();
00349       while ( elem != NULL )
00350       {
00351          if ( Tools::to_lower(elem->Attribute("name")) == channel )
00352          {
00353             TiXmlElement elem2("user");
00354             elem2.SetAttribute("mask",mask);
00355             elem2.SetAttribute("level",level);
00356             elem->InsertEndChild(elem2) ;
00357             this->doc->SaveFile();
00358             return true;
00359          }
00360          elem = elem->NextSiblingElement();
00361       }
00362    }
00363    return false;
00364 }
00365 
00373 bool Admin::userExists(string channel,string mask)
00374 {
00375    channel = Tools::to_lower(channel);
00376    mask = Tools::to_lower(mask);
00377    TiXmlElement * elem;
00378    TiXmlElement * elem2;
00379    elem = this->root->FirstChild("channels")->FirstChildElement();
00380    while ( elem != NULL )
00381    {
00382       if ( Tools::to_lower(elem->Attribute("name")) == channel )
00383       {
00384          elem2 = elem->FirstChildElement();
00385          while ( elem2 != NULL )
00386          {
00387             if(Tools::to_lower(elem2->Attribute("mask")) == mask ) {
00388                return true;
00389             }
00390             elem2 = elem2->NextSiblingElement();
00391          }
00392          return false;
00393       }
00394       elem = elem->NextSiblingElement();
00395    }
00396    return false;
00397 }
00398 
00405 bool Admin::delUser(string channel,string mask)
00406 {
00407    channel = Tools::to_lower(channel);
00408    mask = Tools::to_lower(mask);
00409    bool back=false;
00410    TiXmlElement * elem;
00411    TiXmlElement * elem2;
00412    elem = this->root->FirstChild("channels")->FirstChildElement();
00413    while ( elem != NULL )
00414    {
00415       if ( Tools::to_lower(elem->Attribute("name")) == channel )
00416       {
00417          elem2 = elem->FirstChildElement();
00418          while ( elem2 != NULL )
00419          {
00420             if(Tools::to_lower(elem2->Attribute("mask")) == mask ) {
00421                back = elem->RemoveChild(elem2);
00422                if (elem->FirstChild() == NULL )
00423                {
00424                   this->delChannel(channel);
00425                }
00426                this->doc->SaveFile();
00427                return back;
00428             }
00429             elem2 = elem2->NextSiblingElement();
00430          }
00431          return back;
00432       }
00433       elem = elem->NextSiblingElement();
00434    }
00435    return back;
00436 }
00437 
00444 bool Admin::updateUserLevel(string channel,string mask,unsigned int level)
00445 {
00446    channel = Tools::to_lower(channel);
00447    mask = Tools::to_lower(mask);
00448    if (level == 0 )
00449    {
00450       return this->delUser(channel,mask);
00451    }
00452    else if ( (level<1) || (level>4) )
00453    {
00454       return false;
00455    }
00456    TiXmlElement * elem;
00457    TiXmlElement * elem2;
00458    if (!this->userExists(channel,mask))
00459    {
00460       this->addUser(channel,mask,level);
00461       return true;
00462    }
00463    else
00464    {
00465       elem = this->root->FirstChild("channels")->FirstChildElement();
00466       while ( elem != NULL )
00467       {
00468          if ( Tools::to_lower(elem->Attribute("name")) == channel )
00469          {
00470             elem2 = elem->FirstChildElement();
00471             while ( elem2 != NULL )
00472             {
00473                if(Tools::to_lower(elem2->Attribute("mask")) == mask ) {
00474                   elem2->SetAttribute("level",level);
00475                   this->doc->SaveFile();
00476                   return true;
00477                }
00478                elem2 = elem2->NextSiblingElement();
00479             }
00480             return false;
00481          }
00482          elem = elem->NextSiblingElement();
00483       }   
00484    }
00485    return false;
00486 }
00487 
00499 unsigned int Admin::getUserLevel(string channel,string mask)
00500 {
00501    channel = Tools::to_lower(channel);
00502    mask = Tools::to_lower(mask);
00503    TiXmlElement * elem;
00504    TiXmlElement * elem2;
00505    elem = this->root->FirstChild("channels")->FirstChildElement();
00506    while ( elem != NULL )
00507    {
00508       if ( Tools::to_lower(elem->Attribute("name")) == channel )
00509       {
00510          elem2 = elem->FirstChildElement();
00511          while ( elem2 != NULL )
00512          {
00513             if(Tools::ircMaskMatch(mask,Tools::to_lower(elem2->Attribute("mask"))) ) {
00514                return Tools::strToInt(elem2->Attribute("level"));
00515             }
00516             elem2 = elem2->NextSiblingElement();
00517          }
00518          return 0;
00519       }
00520       elem = elem->NextSiblingElement();
00521    }
00522    return 0;
00523 }
00524 
00536 unsigned int Admin::getMaskLevel(string channel,string mask)
00537 {
00538    channel = Tools::to_lower(channel);
00539    mask = Tools::to_lower(mask);
00540    TiXmlElement * elem;
00541    TiXmlElement * elem2;
00542    string admMask;
00543    string nick1,nick2,ident1,ident2,host1,host2;
00544    nick1 = mask.substr(0,mask.find("!"));
00545    ident1 = mask.substr(mask.find("!")+1,mask.find("@")-mask.find("!")-1); 
00546    host1 = mask.substr(mask.find("@")+1) ;
00547    elem = this->root->FirstChild("channels")->FirstChildElement();
00548    while ( elem != NULL )
00549    {
00550       if ( Tools::to_lower(elem->Attribute("name")) == channel )
00551       {
00552          elem2 = elem->FirstChildElement();
00553          while ( elem2 != NULL )
00554          {
00555             admMask = Tools::to_lower(elem2->Attribute("mask")) ;
00556             nick2 = admMask.substr(0,admMask.find("!"));
00557             ident2 = admMask.substr(admMask.find("!")+1,admMask.find("@")-admMask.find("!")-1);
00558             host2 = admMask.substr(admMask.find("@")+1) ;
00559             if((Tools::masksMatch((char*)nick1.c_str(),(char*)nick2.c_str())==1)&&(Tools::masksMatch((char*)ident1.c_str(),(char*)ident2.c_str())==1)&&(Tools::masksMatch((char*)host1.c_str(),(char*)host2.c_str())==1)) {
00560                return Tools::strToInt(elem2->Attribute("level"));
00561             }
00562             elem2 = elem2->NextSiblingElement();
00563          }
00564          return 0;
00565       }
00566       elem = elem->NextSiblingElement();
00567    }
00568    return 0;
00569 }
00570 
00576 vector<string> Admin::chanLevels(string channel)
00577 {
00578    vector<string> back;
00579    back.clear();
00580    TiXmlElement * elem;
00581    TiXmlElement * elem2;
00582    elem = this->root->FirstChild("channels")->FirstChildElement();
00583    while ( elem != NULL )
00584    {
00585       if ( Tools::to_lower(elem->Attribute("name")) == Tools::to_lower(channel) )
00586       {
00587          elem2 = elem->FirstChildElement();
00588          while ( elem2 != NULL )
00589          {
00590             back.push_back(string(elem2->Attribute("mask"))+string(":")+string(elem2->Attribute("level")));
00591             elem2 = elem2->NextSiblingElement();
00592          }
00593          return back;
00594       }
00595       elem = elem->NextSiblingElement();
00596    }
00597    back.push_back(channel +" : unknown channel");
00598    return back;
00599 }
00600 
00605 vector<string> Admin::getChannelsList()
00606 {
00607    vector<string> back;
00608    back.clear();
00609    TiXmlElement * elem;
00610    elem = this->root->FirstChild("channels")->FirstChildElement();
00611    while ( elem != NULL )
00612    {
00613       back.push_back(elem->Attribute("name"));
00614       elem = elem->NextSiblingElement();
00615    }
00616    return back;
00617 }
00618 
00625 void Admin::addOnlyonCommand(string command,string channel)
00626 {
00627    TiXmlElement elem("item");
00628    elem.SetAttribute("command",Tools::to_lower(command));
00629    elem.SetAttribute("channel",Tools::to_lower(channel));
00630    this->root->FirstChild("onlyon_commands")->InsertEndChild(elem) ;
00631    this->doc->SaveFile();
00632 }
00633 
00639 void Admin::delOnlyonCommand(string command,string channel)
00640 {
00641    TiXmlElement * elem;
00642    elem = this->root->FirstChild("onlyon_commands")->FirstChildElement();
00643    while ( elem != NULL )
00644    {
00645       if ( (Tools::to_lower(elem->Attribute("command")) == Tools::to_lower(command)) && (Tools::to_lower(elem->Attribute("channel")) == Tools::to_lower(channel)) )
00646       {
00647          this->root->FirstChild("onlyon_commands")->RemoveChild(elem) ;
00648       }
00649       elem = elem->NextSiblingElement();
00650    }
00651    this->doc->SaveFile();
00652 }
00653 
00659 void Admin::enableCommand(string command,string channel)
00660 {
00661    TiXmlElement * elem;
00662    elem = this->root->FirstChild("disabled_commands")->FirstChildElement();
00663    while ( elem != NULL )
00664    {
00665       if ( (Tools::to_lower(elem->Attribute("command")) == Tools::to_lower(command)) && (Tools::to_lower(elem->Attribute("channel")) == Tools::to_lower(channel)) )
00666       {
00667          this->root->FirstChild("disabled_commands")->RemoveChild(elem) ;
00668       }
00669       elem = elem->NextSiblingElement();
00670    }
00671    this->doc->SaveFile();
00672 }
00673 
00679 void Admin::disableCommand(string command,string channel)
00680 {
00681    TiXmlElement elem("item");
00682    elem.SetAttribute("command",Tools::to_lower(command));
00683    elem.SetAttribute("channel",Tools::to_lower(channel));
00684    this->root->FirstChild("disabled_commands")->InsertEndChild(elem) ;
00685    this->doc->SaveFile();
00686 }
00687 
00695 bool Admin::commandOK(string command,string channel)
00696 {
00697    TiXmlElement * elem;
00698    vector<string> onlyon;
00699    elem = this->root->FirstChild("disabled_commands")->FirstChildElement();
00700    while ( elem != NULL )
00701    {
00702       if((Tools::to_lower(elem->Attribute("command")) == Tools::to_lower(command)) && (Tools::to_lower(elem->Attribute("channel")) == Tools::to_lower(channel)))
00703          return false;
00704       elem = elem->NextSiblingElement();
00705    }
00706    elem = this->root->FirstChild("onlyon_commands")->FirstChildElement();
00707    while ( elem != NULL )
00708    {
00709       if((Tools::to_lower(elem->Attribute("command")) == Tools::to_lower(command)) )
00710          onlyon.push_back(Tools::to_lower(elem->Attribute("channel")));
00711       elem = elem->NextSiblingElement();
00712    }
00713    if ( onlyon.size() > 0 )
00714    {
00715       if (! Tools::isInVector(onlyon,Tools::to_lower(channel)) )
00716          return false;
00717    }
00718    return true;
00719 }
00720 
00725 vector<string> Admin::commandsStatus()
00726 {
00727    
00728    vector<string> back;
00729    back.clear();
00730    TiXmlElement * elem;
00731    elem = this->root->FirstChild("disabled_commands")->FirstChildElement();
00732    while ( elem != NULL )
00733    {  
00734       back.push_back(string(elem->Attribute("command"))+" disabled on "+string(elem->Attribute("channel")));
00735       elem = elem->NextSiblingElement();
00736    }
00737    elem = this->root->FirstChild("onlyon_commands")->FirstChildElement();
00738    while ( elem != NULL )
00739    {  
00740       back.push_back(string(elem->Attribute("command"))+" only on "+string(elem->Attribute("channel")));
00741       elem = elem->NextSiblingElement();
00742    }
00743    return back;
00744 }
00745 
00746 extern "C"
00747 { 
00748         Plugin *contruct_admin(BotKernel*b)
00749         {
00750                 return new Admin(b);
00751         }
00752         void destroy_admin(Plugin*p)
00753         {
00754                 delete p;
00755         }
00756         bool addsuperadmin (Message*m,Plugin*p,BotKernel*b)
00757         {
00758       Admin * adm = (Admin*)p;
00759                 ConfigurationFile * cf = b->getCONFF();
00760       if(m->isPrivate())
00761       {
00762          if ( m->getSplit().size() == 6 )
00763          {
00764             if ( m->getPart(4) == cf->getValue(p->getName()+".sapass"))
00765             {
00766                if (adm->addSuperAdmin(m->getPart(5)))
00767                {
00768                   b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(5) + " added to super admins list"));
00769                   b->getSysLog()->log(m->getPart(5) + " added to super admins list by"+ m->getSender(),INFO);
00770                }
00771             }
00772          }
00773       }
00774                 return true;
00775         }
00776         bool addtempsuperadmin (Message*m,Plugin*p,BotKernel*b)
00777         {
00778       Admin * adm = (Admin*)p;
00779                 ConfigurationFile * cf = b->getCONFF();
00780       if(m->isPrivate())
00781       {
00782          if ( m->getSplit().size() == 7 )
00783          {
00784             if ( m->getPart(4) == cf->getValue(p->getName()+".sapass"))
00785             {
00786                if (adm->addTempSuperAdmin(m->getPart(5),Tools::strtimeToSeconds(m->getPart(6))))
00787                {
00788                   b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(5) + " temporary added to super admins list ("+m->getPart(6)+")"));
00789                   b->getSysLog()->log(m->getPart(5) + " temporary added to super admins list by "+ m->getSender()+" ("+m->getPart(6)+")",INFO);
00790                }
00791             }
00792          }
00793       }
00794                 return true;
00795         }
00796    bool setSuperAdminPass(Message*m,Plugin*p,BotKernel*b) 
00797    {
00798                 ConfigurationFile * cf = b->getCONFF();
00799       if(m->isPrivate())
00800       {
00801          if ( m->getSplit().size() == 6 )
00802          {
00803             if ( m->getPart(4) == cf->getValue(p->getName()+".sapass"))
00804             {
00805                cf->setValue(p->getName()+".sapass",m->getPart(5));
00806                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Super admin pass changed to "+m->getPart(5)));
00807                b->getSysLog()->log("Super admin pass changed from "+ m->getPart(4) +" to "+m->getPart(5)+ " by "+m->getSender(),WARNING);
00808             }
00809          }
00810       }
00811       return true;
00812    }
00813    bool clearTemporaryAdmins(Message*m,Plugin*p,BotKernel*b) 
00814    {
00815       ((Admin*)p)->clearTempAdmins() ;
00816       return true;
00817    }
00818         bool superadminlist (Message*m,Plugin*p,BotKernel*b)
00819         {
00820       Admin * adm = (Admin*)p;
00821       if(m->isPrivate())
00822       {
00823          if ( adm->isSuperAdmin( m->getSender()))
00824             b->send(IRCProtocol::sendNotices(m->getNickSender(),Tools::gatherVectorElements(adm->superAdminList()," ",4)));
00825       }
00826                 return true;
00827         }
00828         bool delsuperadmin (Message*m,Plugin*p,BotKernel*b)
00829         {
00830       Admin * adm = (Admin*)p;
00831                 ConfigurationFile * cf = b->getCONFF();
00832       if(m->isPrivate())
00833       {
00834          if ( m->getSplit().size() == 6 )
00835          {
00836             if ( m->getPart(4) == cf->getValue(p->getName()+".sapass"))
00837             {
00838                if (adm->delSuperAdmin(Tools::strToInt(m->getPart(5))))
00839                {
00840                   b->send(IRCProtocol::sendNotice(m->getNickSender(),"#"+m->getPart(5) + " removed from super admins list"));
00841                   b->getSysLog()->log("#"+m->getPart(5) + " removed from super admins list by "+m->getSender(),INFO);
00842                }
00843             }
00844          }
00845       }
00846                 return true;
00847         }
00848    bool reset (Message*m,Plugin*p,BotKernel*b)
00849    {
00850       Admin * adm = (Admin*)p;     
00851       if(m->isPrivate())
00852       {
00853          if ( adm->isSuperAdmin( m->getSender())) {
00854                                 b->getSysLog()->log("Bot reseted by "+m->getSender(),WARNING);
00855                                 b->setConnected(false);
00856          }
00857       }
00858                 return true;
00859    }
00860    bool disconnect (Message*m,Plugin*p,BotKernel*b)
00861    {
00862       Admin * adm = (Admin*)p;     
00863       if(m->isPrivate())
00864       {
00865          if ( adm->isSuperAdmin( m->getSender())) {
00866                                 b->getSysLog()->log("Bot stoped by "+m->getSender(),WARNING);
00867             b->send(IRCProtocol::quitServer("o/"));
00868             sleep(1);
00869                            b->stop();
00870          }
00871       }
00872                 return true;
00873    }
00874    bool getconfvalue (Message*m,Plugin*p,BotKernel*b)
00875    {
00876       Admin * adm = (Admin*)p;     
00877                 ConfigurationFile * cf = b->getCONFF();
00878       if(m->isPrivate())
00879       {
00880          if ( (m->getSplit().size() == 5)&&(adm->isSuperAdmin( m->getSender())) )
00881          {
00882             b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" : "+cf->getValue(m->getPart(4),false)));
00883          }
00884       }
00885                 return true;
00886    }
00887    bool setconfvalue (Message*m,Plugin*p,BotKernel*b)
00888    {
00889       Admin * adm = (Admin*)p;     
00890                 ConfigurationFile * cf = b->getCONFF();
00891       if(m->isPrivate())
00892       {
00893          if ( m->getSplit().size() == 6 )
00894          {
00895             if ( adm->isSuperAdmin( m->getSender())&& (m->getPart(4)!=(p->getName()+".sapass")))
00896             {
00897                cf->setValue(m->getPart(4),m->getPart(5));
00898                b->getSysLog()->log(m->getPart(4)+" set to " +m->getPart(5)+" by "+m->getSender(),INFO);
00899                b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" set to " +m->getPart(5)));
00900             }
00901          }
00902       }
00903                 return true;
00904    }
00905    bool deletekey (Message*m,Plugin*p,BotKernel*b)
00906    {
00907       Admin * adm = (Admin*)p;     
00908                 ConfigurationFile * cf = b->getCONFF();
00909       if(m->isPrivate())
00910       {
00911          if ( m->getSplit().size() == 5 )
00912          {
00913             if ( adm->isSuperAdmin( m->getSender())&& (m->getPart(4)!=(p->getName()+".sapass")))
00914             {
00915                if (cf->delKey(m->getPart(4)))
00916                {
00917                   b->getSysLog()->log(m->getPart(4)+" deleted by "+m->getSender(),INFO);
00918                   b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" deleted"));
00919                }
00920                else
00921                {
00922                   b->send(IRCProtocol::sendNotice(m->getNickSender(),"key not found"));
00923                }
00924             }
00925          }
00926       }
00927                 return true;
00928    }
00929    bool loadconffile (Message*m,Plugin*p,BotKernel*b)
00930    {
00931       string buffer;
00932       Admin * adm = (Admin*)p;     
00933                 ConfigurationFile * cf = b->getCONFF();
00934       if(m->isPrivate())
00935       {
00936          if ( adm->isSuperAdmin( m->getSender()))
00937          {
00938             if(cf->load())
00939             {
00940                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Configuration file loaded"));
00941                b->getSysLog()->log("Configuration file loaded by "+m->getSender(),INFO);  
00942             }
00943             else
00944             {
00945                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Failed to load configuration file"));
00946                b->getSysLog()->log("Failed to load configuration file (by "+m->getSender()+")",WARNING); 
00947             }
00948          }
00949       }
00950                 return true;
00951    }
00952    bool flushconffile (Message*m,Plugin*p,BotKernel*b)
00953    {
00954       string buffer;
00955       Admin * adm = (Admin*)p;     
00956                 ConfigurationFile * cf = b->getCONFF();
00957       if(m->isPrivate())
00958       {
00959          if ( adm->isSuperAdmin( m->getSender()))
00960          {
00961             if(cf->flush())
00962             {
00963                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Configuration file flushed"));
00964                b->getSysLog()->log("Configuration file flushed by "+m->getSender(),INFO);
00965             }
00966             else
00967             {
00968                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Configuration file flushing failed"));
00969                b->getSysLog()->log("Configuration file flushing failed (by "+m->getSender()+")",WARNING);
00970             }
00971          }
00972       }
00973                 return true;
00974    }
00975    bool setloglevel (Message*m,Plugin*p,BotKernel*b)
00976    {
00977       Admin * adm = (Admin*)p;     
00978                 ConfigurationFile * cf = b->getCONFF();
00979       if(m->isPrivate() && (m->nbParts() == 5) && (adm->isSuperAdmin(m->getSender())) && ((m->getPart(4)=="error") ||(m->getPart(4)=="warning") || (m->getPart(4)=="info") || (m->getPart(4)=="nothing")))
00980       { 
00981          cf->setValue("kernel.logminlevel",m->getPart(4));
00982          b->getSysLog()->log("kernel.logminlevel set to " +m->getPart(4)+" by "+m->getSender(),INFO);
00983          b->getSysLog()->setLogLevel(m->getPart(4));
00984          b->send(IRCProtocol::sendNotice(m->getNickSender(),"kernel.logminlevel set to " +m->getPart(4)));
00985       }
00986       return true;
00987    }
00988    bool setlogkeepfiles (Message*m,Plugin*p,BotKernel*b)
00989    {
00990       Admin * adm = (Admin*)p;     
00991                 ConfigurationFile * cf = b->getCONFF();
00992       if(m->isPrivate() && (m->nbParts() == 5) && (adm->isSuperAdmin(m->getSender())))
00993       { 
00994          cf->setValue("kernel.logkeepfiles",m->getPart(4));
00995          b->getSysLog()->log("kernel.logkeepfiles set to " +m->getPart(4)+" by "+m->getSender(),INFO);
00996          b->getSysLog()->setKeepFiles((m->getPart(4)=="1")?true:false);
00997          b->send(IRCProtocol::sendNotice(m->getNickSender(),"kernel.logkeepfiles set to " +m->getPart(4)));
00998       }
00999       return true;
01000    }
01001    bool setlogperiod (Message*m,Plugin*p,BotKernel*b)
01002    {
01003       Admin * adm = (Admin*)p;     
01004                 ConfigurationFile * cf = b->getCONFF();
01005       if(m->isPrivate() && (m->nbParts() == 5) && (adm->isSuperAdmin(m->getSender())))
01006       { 
01007          cf->setValue("kernel.logperiod",m->getPart(4));
01008          b->getSysLog()->log("kernel.logperiod set to " +m->getPart(4)+" by "+m->getSender(),INFO);
01009          b->getSysLog()->setPeriodFormat(m->getPart(4));
01010          b->send(IRCProtocol::sendNotice(m->getNickSender(),"kernel.logperiod set to " +m->getPart(4)));
01011       }
01012       return true;
01013    }
01014    bool addOnlyon (Message*m,Plugin*p,BotKernel*b)
01015    {
01016       string buffer;
01017       Admin * adm = (Admin*)p;     
01018       if(m->isPrivate())
01019       {
01020          if ( m->getSplit().size() == 6)
01021          {
01022             if ( adm->isSuperAdmin( m->getSender()))
01023             {
01024                adm->addOnlyonCommand(m->getPart(4),m->getPart(5));
01025                b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" only on "+m->getPart(5)+" by "+m->getSender()));
01026                b->getSysLog()->log(m->getPart(4)+" only on "+m->getPart(5)+" by "+m->getSender(),INFO);
01027             }
01028          }
01029       }
01030                 return true;
01031    }
01032    bool delOnlyon (Message*m,Plugin*p,BotKernel*b)
01033    {
01034       string buffer;
01035       Admin * adm = (Admin*)p;     
01036       if(m->isPrivate())
01037       {
01038          if ( m->getSplit().size() == 6)
01039          {
01040             if ( adm->isSuperAdmin( m->getSender()))
01041             {
01042                adm->delOnlyonCommand(m->getPart(4),m->getPart(5));
01043                b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" no more only on "+m->getPart(5)+" by "+m->getSender()));
01044                b->getSysLog()->log(m->getPart(4)+" no more only on "+m->getPart(5)+" by "+m->getSender(),INFO);
01045             }
01046          }
01047       }
01048                 return true;
01049    }
01050    bool enable (Message*m,Plugin*p,BotKernel*b)
01051    {
01052       string buffer;
01053       Admin * adm = (Admin*)p;     
01054       if(m->isPrivate())
01055       {
01056          if ( m->getSplit().size() == 6)
01057          {
01058             if ( adm->isSuperAdmin( m->getSender()))
01059             {
01060                adm->enableCommand(m->getPart(4),m->getPart(5));
01061                b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" enabled on "+m->getPart(5)+" by "+m->getSender()));
01062                b->getSysLog()->log(m->getPart(4)+" enabled on "+m->getPart(5)+" by "+m->getSender(),INFO);
01063             }
01064          }
01065       }
01066                 return true;
01067    }
01068    bool disable (Message*m,Plugin*p,BotKernel*b)
01069    {
01070       string buffer;
01071       Admin * adm = (Admin*)p;     
01072       if(m->isPrivate())
01073       {
01074          if ( m->getSplit().size() == 6)
01075          {
01076             if ( adm->isSuperAdmin( m->getSender()))
01077             {
01078                adm->disableCommand(m->getPart(4),m->getPart(5));
01079                b->send(IRCProtocol::sendNotice(m->getNickSender(),m->getPart(4)+" disabled on "+m->getPart(5)+" by "+m->getSender()));
01080                b->getSysLog()->log(m->getPart(4)+" disabled on "+m->getPart(5)+" by "+m->getSender(),INFO);
01081             }
01082          }
01083       }
01084                 return true;
01085    }
01086         bool commandsStatus (Message*m,Plugin*p,BotKernel*b)
01087         {
01088       Admin * adm = (Admin*)p;
01089       if(m->isPrivate())
01090       {
01091          if ( adm->isSuperAdmin( m->getSender()))
01092             b->send(IRCProtocol::sendNotices(m->getNickSender(),Tools::gatherVectorElements(adm->commandsStatus()," | ",2)));
01093       }
01094                 return true;
01095         }
01096         bool allowedCommandCheck (Message*m,Plugin*p,BotKernel*b)
01097         {
01098       Admin * adm = (Admin*)p;
01099                 ConfigurationFile * cf = b->getCONFF();
01100            if ( (m->getSplit().size() >= 4) && (m->isPublic()) )
01101            {
01102                         if (m->getPart(3).length() > (":"+cf->getValue("kernel.command_prefix")).length())
01103          {
01104             if (! adm->commandOK(m->getPart(3).substr((":"+cf->getValue("kernel.command_prefix")).length()),m->getSource()) )
01105                          return false;
01106             else
01107                return true;
01108          }
01109          return true;
01110                 }
01111       return true;
01112         }
01113         bool chanlev (Message*m,Plugin*p,BotKernel*b)
01114         {
01115       Admin * adm = (Admin*)p;
01116       if ( m->isPrivate() )
01117       {
01118          if ( m->getSplit().size() == 5)
01119          {
01120             if ( (adm->getUserLevel(m->getPart(4),m->getSender())>0) || (adm->isSuperAdmin(m->getSender())) )
01121             {
01122                b->send(IRCProtocol::sendNotice(m->getNickSender(),"Chanlev for "+m->getPart(4)+":"));
01123                b->send(IRCProtocol::sendNotices(m->getNickSender(),Tools::gatherVectorElements(adm->chanLevels(m->getPart(4))," ",3)));
01124             }
01125          }
01126          else if ( m->getSplit().size() == 7 )
01127          {  
01128             if ( (adm->getUserLevel(m->getPart(4),m->getSender())>2) || (adm->isSuperAdmin(m->getSender())) )
01129             {
01130                adm->updateUserLevel(m->getPart(4),m->getPart(5),Tools::strToInt(m->getPart(6)));
01131                b->send(IRCProtocol::sendNotice(m->getNickSender(),"done."));
01132             }  
01133          }
01134       }
01135       return true;
01136         }
01137    bool joinChannel (Message*m,Plugin*p,BotKernel*b)
01138    {
01139       string buffer;
01140       Admin * adm = (Admin*)p;     
01141       if(m->isPrivate())
01142       {
01143          if ( m->getSplit().size() == 5)
01144          {
01145             if ( adm->isSuperAdmin( m->getSender()))
01146             {
01147                b->send(IRCProtocol::joinChannel(m->getPart(4)));
01148                b->getSysLog()->log("Joined "+m->getPart(4)+" (by "+m->getSender()+")",INFO);
01149             }
01150          }
01151       }
01152                 return true;
01153    }
01154    bool leaveChannel (Message*m,Plugin*p,BotKernel*b)
01155    {
01156       string buffer;
01157       Admin * adm = (Admin*)p;     
01158       if(m->isPrivate())
01159       {
01160          if ( m->getSplit().size() >= 5)
01161          {
01162             if ( adm->isSuperAdmin( m->getSender()))
01163             {
01164                b->send(IRCProtocol::leaveChannel(m->getPart(4),Tools::vectorToString(m->getSplit()," ",5)));
01165                b->getSysLog()->log("Left "+m->getPart(4)+" (by "+m->getSender()+")",INFO);
01166             }
01167          }
01168       }
01169                 return true;
01170    }
01171    bool cycleChannel (Message*m,Plugin*p,BotKernel*b)
01172    {
01173       string buffer;
01174       Admin * adm = (Admin*)p;     
01175       if(m->isPrivate())
01176       {
01177          if ( m->getSplit().size() >= 5)
01178          {
01179             if ( adm->isSuperAdmin( m->getSender()))
01180             {
01181                b->send(IRCProtocol::leaveChannel(m->getPart(4),"brb o/"));
01182                b->send(IRCProtocol::joinChannel(m->getPart(4)));
01183             }
01184          }
01185       }
01186                 return true;
01187    }
01188    bool setNick (Message*m,Plugin*p,BotKernel*b)
01189    {
01190       Admin * adm = (Admin*)p;     
01191       ConfigurationFile * cf = b->getCONFF();
01192       if(m->isPrivate())
01193       {
01194          if ( m->getSplit().size() == 5)
01195          {
01196             if ( adm->isSuperAdmin( m->getSender()))
01197             {
01198                cf->setValue("kernel.nick",m->getPart(4));
01199                b->send( IRCProtocol::changeNick(m->getPart(4)) ) ;
01200                b->getSysLog()->log("Nick changed to "+m->getPart(4)+" (by "+m->getSender()+")",INFO);
01201                b->setNick(m->getPart(4));
01202             }
01203          }
01204       }
01205                 return true;
01206    }
01207    bool tell (Message*m,Plugin*p,BotKernel*b)
01208    {
01209       string buffer;
01210       Admin * adm = (Admin*)p;     
01211       if(m->isPrivate())
01212       {
01213          if ( m->getSplit().size() > 5)
01214          {
01215             if ( adm->isSuperAdmin( m->getSender()))
01216             {
01217                b->send(IRCProtocol::sendMsg(m->getPart(4),Tools::vectorToString(m->getSplit()," ",5)));
01218             }
01219          }
01220       }
01221                 return true;
01222    }
01223    bool notice (Message*m,Plugin*p,BotKernel*b)
01224    {
01225       string buffer;
01226       Admin * adm = (Admin*)p;     
01227       if(m->isPrivate())
01228       {
01229          if ( m->getSplit().size() > 5)
01230          {
01231             if ( adm->isSuperAdmin( m->getSender()))
01232             {
01233                b->send(IRCProtocol::sendNotice(m->getPart(4),Tools::vectorToString(m->getSplit()," ",5)));
01234             }
01235          }
01236       }
01237                 return true;
01238    }
01239    bool raw (Message*m,Plugin*p,BotKernel*b)
01240    {
01241       string buffer;
01242       Admin * adm = (Admin*)p;     
01243       if(m->isPrivate())
01244       {
01245          if ( m->getSplit().size() > 5)
01246          {
01247             if ( adm->isSuperAdmin( m->getSender()))
01248             {
01249                b->send(Tools::vectorToString(m->getSplit()," ",4));
01250             }
01251          }
01252       }
01253                 return true;
01254    }
01255    bool whoami (Message*m,Plugin*p,BotKernel*b)
01256    {
01257       vector<string> msgs;
01258       vector<string> channs;
01259       unsigned int level = 0 ;
01260       msgs.push_back(m->getSender()+" :");
01261       Admin * adm = (Admin*)p;
01262       if ( adm->isSuperAdmin(m->getSender()))
01263          msgs.push_back("Bot Super Admin");
01264       channs = adm->getChannelsList() ;
01265       for ( unsigned int i = 0 ; i < channs.size() ; i ++ )
01266       {
01267          level = adm->getUserLevel(channs[i],m->getSender() ) ;
01268          if ( level > 0 )
01269             msgs.push_back(channs[i] + " : level " + Tools::intToStr(level) );
01270       }
01271       msgs.push_back("End.");
01272       b->send(IRCProtocol::sendNotices(m->getNickSender(),msgs)) ;
01273                 return true;
01274    }
01275    bool reauth (Message*m,Plugin*p,BotKernel*b)
01276    {
01277       string buffer;
01278       Admin * adm = (Admin*)p; 
01279       plugin_function function ;
01280       pPlugin * pp = b->getPlugin("postconnect");    
01281       if(m->isPrivate())
01282       {
01283          if ( pp != NULL )
01284          {
01285             if (adm->isSuperAdmin( m->getSender()))
01286             { 
01287                function = (plugin_function)(intptr_t) dlsym(pp->handle,"onEndOfMOTD"); //*(void **)(&function) = dlsym(pp->handle,"onEndOfMOTD");
01288                if ( function != NULL )
01289                {
01290                   function(m,pp->object,b);
01291                }
01292             }
01293          }
01294       }
01295                 return true;
01296    }
01297    bool onInvite (Message*m,Plugin*p,BotKernel*b)
01298    {
01299       Admin * adm = (Admin*)p;     
01300       if ( adm->isSuperAdmin( m->getSender()))
01301       if(m->isPrivate())
01302       {
01303          if ( adm->isSuperAdmin( m->getSender())) {
01304             b->send(IRCProtocol::joinChannel(m->getPart(3)));
01305                                 b->getSysLog()->log("Invited on "+ m->getSource()+" by "+m->getSender(),INFO);
01306          }
01307       }
01308                 return true;
01309    }
01310    bool error (Message*m,Plugin*p,BotKernel*b)
01311    {
01312       b->getSysLog()->log(m->getMessage(),ERROR);
01313                 return true;
01314    }
01315    bool getnbcountdowns (Message*m,Plugin*p,BotKernel*b)
01316    {
01317       Admin * adm = (Admin*)p;     
01318       if ( adm->isSuperAdmin( m->getSender()) && m->isPrivate()) {
01319          b->send(IRCProtocol::sendNotice(m->getNickSender(),"Countdowns : "+Tools::intToStr(b->getCountDowns()->size())));
01320       }
01321                 return true;
01322    }
01323    bool clearCountDowns (Message*m,Plugin*p,BotKernel*b)
01324    {
01325       Admin * adm = (Admin*)p;     
01326       if ( adm->isSuperAdmin( m->getSender()) && m->isPrivate()) {
01327          b->getCountDowns()->clear();
01328          b->send(IRCProtocol::sendNotice(m->getNickSender(),"Countdowns cleared"));
01329          b->getSysLog()->log("countdowns cleared by "+m->getSender(),INFO);
01330       }
01331                 return true;
01332    }
01333 }

Generated on Sun Aug 16 15:28:27 2009 for trustyRC by  doxygen 1.5.8