00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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");
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 }