From e0cc12e207b4f96533f4ea4d377a811e9e092f51 Mon Sep 17 00:00:00 2001 From: JAJames Date: Sat, 25 Jun 2016 21:06:45 -0400 Subject: [PATCH] Updated Jupiter; adjusted config and Bot as necessary --- Bot/IRC_Bot.cpp | 16 +++++++---- Bot/IRC_Bot.h | 4 +-- Bot/Jupiter_Bot.h | 12 +++++++- Bot/Main.cpp | 48 +++++++++++++++++++------------- Bot/ServerManager.cpp | 8 ++++-- Config.ini | 12 ++++---- Jupiter | 2 +- Release/Bot.lib | Bin 19532 -> 19516 bytes Release/Plugins/RenX.Core.lib | Bin 206992 -> 206992 bytes RenX.Commands/RenX_Commands.cpp | 1 - 10 files changed, 63 insertions(+), 40 deletions(-) diff --git a/Bot/IRC_Bot.cpp b/Bot/IRC_Bot.cpp index 65a9f3c..bbbda91 100644 --- a/Bot/IRC_Bot.cpp +++ b/Bot/IRC_Bot.cpp @@ -27,7 +27,7 @@ using namespace Jupiter::literals; -IRC_Bot::IRC_Bot(const Jupiter::ReadableString &configSection) : Client(configSection) +IRC_Bot::IRC_Bot(const Jupiter::INIFile::Section *in_primary_section, const Jupiter::INIFile::Section *in_secondary_section) : Client(in_primary_section, in_secondary_section) { IRC_Bot::commandPrefix = this->readConfigValue("Prefix"_jrs); for (size_t i = 0; i != IRCMasterCommandList->size(); i++) @@ -105,7 +105,7 @@ void IRC_Bot::setCommandAccessLevels() { auto set_command_access_levels = [this](const Jupiter::ReadableString §ion_name) { - Jupiter::INIFile::Section *section = this->Config->getSection(section_name); + Jupiter::INIFile::Section *section = g_config->getSection(section_name); if (section != nullptr) { @@ -162,13 +162,19 @@ void IRC_Bot::setCommandAccessLevels() } }; - set_command_access_levels("DefaultCommands"_jrs); - set_command_access_levels(this->getConfigSection() + "Commands"_jrs); + const Jupiter::INIFile::Section *section; + + section = this->getSecondaryConfigSection(); + if (section != nullptr) + set_command_access_levels(section->getName() + "Commands"_jrs); + + section = this->getPrimaryConfigSection(); + if (section != nullptr) + set_command_access_levels(section->getName() + "Commands"_jrs); } int IRC_Bot::OnRehash() { - if (Config->reload() == Jupiter::ERROR_INDICATOR) return 1; IRC_Bot::setCommandAccessLevels(); return 0; } diff --git a/Bot/IRC_Bot.h b/Bot/IRC_Bot.h index c36c5cf..2850103 100644 --- a/Bot/IRC_Bot.h +++ b/Bot/IRC_Bot.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -110,7 +110,7 @@ public: bool OnBadRehash(bool removed) { return removed; }; /** Constructor for IRC_Bot */ - IRC_Bot(const Jupiter::ReadableString &configSection); + IRC_Bot(const Jupiter::INIFile::Section *in_primary_section, const Jupiter::INIFile::Section *in_secondary_section); /** Destructor for IRC_Bot */ ~IRC_Bot(); diff --git a/Bot/Jupiter_Bot.h b/Bot/Jupiter_Bot.h index 3d9c417..b6c8f36 100644 --- a/Bot/Jupiter_Bot.h +++ b/Bot/Jupiter_Bot.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -36,4 +36,14 @@ #define JUPITER_BOT_API #endif // _WIN32 +#if defined __cplusplus + +/** Forward declaration */ +namespace Jupiter { class INIFile; } + +/** Application config file */ +extern Jupiter::INIFile *g_config; + +#endif // __cplusplus + #endif // JUPITER_BOT_API \ No newline at end of file diff --git a/Bot/Main.cpp b/Bot/Main.cpp index 49f25a6..1a0778d 100644 --- a/Bot/Main.cpp +++ b/Bot/Main.cpp @@ -35,6 +35,9 @@ using namespace Jupiter::literals; +Jupiter::INIFile o_config; +Jupiter::INIFile *g_config = &o_config; + #define INPUT_BUFFER_SIZE 2048 struct ConsoleInput @@ -89,11 +92,11 @@ int main(int argc, const char **args) atexit(onExit); std::set_terminate(onTerminate); std::thread inputThread(inputLoop); - Jupiter::ReferenceString command; + Jupiter::ReferenceString command, plugins_directory, configs_directory; srand(static_cast(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count())); puts(Jupiter::copyright); - const char *configFileName = CONFIG_INI; + const char *configFileName = "Config.ini"; for (int i = 1; i < argc; i++) { @@ -105,9 +108,9 @@ int main(int argc, const char **args) else if ("-config"_jrs.equalsi(args[i]) && ++i < argc) configFileName = args[i]; else if ("-pluginsdir"_jrs.equalsi(args[i]) && ++i < argc) - Jupiter::Plugin::setDirectory(Jupiter::ReferenceString(args[i])); + plugins_directory = args[i]; else if ("-configsdir"_jrs.equals(args[i]) && ++i < argc) - Jupiter::Plugin::setConfigDirectory(Jupiter::ReferenceString(args[i])); + configs_directory = args[i]; else if ("-configFormat"_jrs.equalsi(args[i]) && ++i < argc) puts("Feature not yet supported!"); else @@ -115,30 +118,34 @@ int main(int argc, const char **args) } puts("Loading config file..."); - if (!Jupiter::IRC::Client::Config->readFile(configFileName)) + if (!o_config.readFile(configFileName)) { puts("Unable to read config file. Closing..."); exit(0); } - fputs("Config loaded. ", stdout); + puts("Config loaded."); - const Jupiter::ReadableString &pDir = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("PluginsDirectory")); - if (pDir.isNotEmpty()) + if (plugins_directory.isEmpty()) + plugins_directory = o_config.get(Jupiter::ReferenceString::empty, "PluginsDirectory"_jrs); + + if (configs_directory.isEmpty()) + configs_directory = o_config.get(Jupiter::ReferenceString::empty, "ConfigsDirectory"_jrs); + + if (plugins_directory.isNotEmpty()) { - Jupiter::Plugin::setDirectory(pDir); - printf("Plugins will be loaded from \"%.*s\"." ENDL, pDir.size(), pDir.ptr()); + Jupiter::Plugin::setDirectory(plugins_directory); + printf("Plugins will be loaded from \"%.*s\"." ENDL, plugins_directory.size(), plugins_directory.ptr()); } - const Jupiter::ReadableString &cDir = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("PluginConfigsDirectory")); - if (cDir.isNotEmpty()) + if (configs_directory.isNotEmpty()) { - Jupiter::Plugin::setDirectory(cDir); - printf("Plugin configs will be loaded from \"%.*s\"." ENDL, cDir.size(), cDir.ptr()); + Jupiter::Plugin::setDirectory(configs_directory); + printf("Plugin configs will be loaded from \"%.*s\"." ENDL, configs_directory.size(), configs_directory.ptr()); } puts("Loading plugins..."); - const Jupiter::ReadableString &pluginList = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("Plugins")); + const Jupiter::ReadableString &pluginList = o_config.get(Jupiter::ReferenceString::empty, "Plugins"_jrs); if (pluginList.isEmpty()) puts("No plugins to load!"); else @@ -148,26 +155,27 @@ int main(int argc, const char **args) for (unsigned int i = 0; i < nPlugins; i++) { Jupiter::ReferenceString plugin = Jupiter::ReferenceString::getWord(pluginList, i, WHITESPACE); - if (Jupiter::Plugin::load(plugin) == nullptr) fprintf(stderr, "WARNING: Failed to load plugin \"%.*s\"!" ENDL, plugin.size(), plugin.ptr()); + if (Jupiter::Plugin::load(plugin) == nullptr) + fprintf(stderr, "WARNING: Failed to load plugin \"%.*s\"!" ENDL, plugin.size(), plugin.ptr()); else printf("\"%.*s\" loaded successfully." ENDL, plugin.size(), plugin.ptr()); } } if (consoleCommands->size() > 0) - printf("%u Console Commands have been initialized%s" ENDL, consoleCommands->size(), getConsoleCommand(STRING_LITERAL_AS_REFERENCE("help")) == nullptr ? "." : "; type \"help\" for more information."); + printf("%u Console Commands have been initialized%s" ENDL, consoleCommands->size(), getConsoleCommand("help"_jrs) == nullptr ? "." : "; type \"help\" for more information."); if (IRCMasterCommandList->size() > 0) printf("%u IRC Commands have been loaded into the master list." ENDL, IRCMasterCommandList->size()); puts("Retreiving network list..."); - const Jupiter::ReadableString &serverList = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Config"), STRING_LITERAL_AS_REFERENCE("Servers")); + const Jupiter::ReadableString &serverList = o_config.get(Jupiter::ReferenceString::empty, "Servers"_jrs); if (serverList == nullptr) puts("Unable to find network list."); else { unsigned int nServers = serverList.wordCount(WHITESPACE); printf("Attempting to connect to %u servers..." ENDL, nServers); - for (unsigned int i = 0; i < nServers; i++) - serverManager->addServer(Jupiter::ReferenceString::getWord(serverList, i, WHITESPACE)); + for (unsigned int index = 0; index < nServers; ++index) + serverManager->addServer(Jupiter::ReferenceString::getWord(serverList, index, WHITESPACE)); } puts("Sockets established."); diff --git a/Bot/ServerManager.cpp b/Bot/ServerManager.cpp index 5e3a5f7..34105f1 100644 --- a/Bot/ServerManager.cpp +++ b/Bot/ServerManager.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -21,6 +21,8 @@ #include "IRC_Bot.h" #include "IRC_Command.h" +using namespace Jupiter::literals; + ServerManager _serverManager; ServerManager *serverManager = &_serverManager; @@ -94,8 +96,8 @@ IRC_Bot *ServerManager::getServer(size_t serverIndex) bool ServerManager::addServer(const Jupiter::ReadableString &serverConfig) { - IRC_Bot *server = new IRC_Bot(serverConfig); - if (server->connect() == true) + IRC_Bot *server = new IRC_Bot(g_config->getSection(serverConfig), g_config->getSection("Default"_jrs)); + if (server->connect()) { ServerManager::servers.add(server); return true; diff --git a/Config.ini b/Config.ini index 72980ab..4bc1471 100644 --- a/Config.ini +++ b/Config.ini @@ -6,7 +6,7 @@ ; A Bool is either true or false. ; A Float is a decimal number. ; -; [Config] + ; This block is used to define settings that are global in nature. ; Currently, there is a "Servers" option to specify what sections ; to look at for server configuration options, and a "Plugins" @@ -14,17 +14,15 @@ ; folder. ; DO NOT INCLUDE A PLUGIN'S FILE EXTENSION (.dll or .so). ; -; Required Settings: -; Servers=String (Format: Server1 Server2) -; -; Optional Settings: +; Settings: ; Plugins=String (Format: Plugin1 Plugin2) +; Servers=String (Format: Server1 Server2) ; PluginsDirectory=String (Default: Plugins\) +; ConfigsDirectory=String (Default: Configs\) ; -[Config] +Plugins=CoreCommands PluginManager ExtraCommands RenX.Core RenX.Commands RenX.Logging RenX.Medals Servers=CnCIRC -Plugins=CoreCommands PluginManager ExtraCommands RenX.Core RenX.Commands RenX.Logging RenX.Medals RenX.SetJoin ; [Default] ; diff --git a/Jupiter b/Jupiter index 427ddec..f52413a 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 427ddecf8d89d64fbe90cbcd8eba3aaa7931939a +Subproject commit f52413a0f821f4bec3e1903ba1629023e3231a09 diff --git a/Release/Bot.lib b/Release/Bot.lib index b8e6a5828781112406c4af8044736ab2b8c179ee..7fdf94679bd988046fb1164344c21a58bd6c3e63 100644 GIT binary patch delta 2395 zcmah~TWnNS6kS7GsY4aCb*4`l+tS3^&U-rV&YfpFGgJgZ8?mVvY)nyGL?kU1>X#!Y1VuMjr{IHo|NeCfE1BxMp4}%FG7!Z-fpQbkMbNAdkw~eVyR?p13Yp=5( z=iK?>gsE`C^kL&eL8r&%@roID?UX-gQ~&mu0gM3cr-6dpOu+I-n62Cyhyq*OH2^ZqP8HM^p>k##7w+Co*0;dQ^gTT}h{i}2V>jJ<+Q;VpZogwPXv9*-rZUNI>?~Ws+wIK9?F|OrDkdD& zQZGJmq)Rqd(HCTTy)$N{_d1!LaK=k?yK3-Gba3?i-#?1-*=w6YkRzb{Tpjr8~$B?Q;RC;UF3O0L# zt3BWM>cLmM9Q=vc}}jCG2ieeC(WPxrjywTf65r@yN!ubCL>t0h``hyASH z?qA_O>u2xt{$Zm@GQjHR1BOXj#C(9&KLuXY)Y6;Uvq6rbna1!0%0=IX2JvoCf5*$L zzAH-XB(adhWUdzXgHFwb8lpNpLyxV+$D<*8>9JLO8{(8Mhqh_-g3}^GVNPj#cm-Vu z*QkbcCs9v^Gj$zeeWb}4sYEz(ATnU2zc13iMP4z|FGpGZc2sYa+;d-Y33+fHYBS8I0lG}Xf(r|Fi5;j5=x#m(%08ai^i;X66*%@?`8Vhz)I XW;*lwtI;^Q&+_`@?iZC!TOI!b$S7ud delta 2316 zcmZ`(ZHQE56h5PCt>dn4>+a5~yScU78nYjB=g!Q|_xIP%&WdP-BD9I1v3{)jr@)F$ z5HnfKIDc#_B2gg|N|*c*MkDsi7IQ(wC`kJuW?Di*QlLHWJ$vt5g$5q(o#&qOoaa5~ zec!W(9n*&$huWS91+{^I&WH5Y@lc?{_-$|!(I}DoG*Ry~QQrfifKC+m6Xm)E`h6k= zPetHAL!{st6a=9$un>7ih@yBeUL*?c1~)-8cu7#YNn~Ifp4(`g(wE6V>MW5$dYvFM zMx@}|BG6#Qz;Qf*@IgVOj!41VBnUMUDMa=Q^ahw#*e3`bz;__rrZ7%4v{{h9N2HLN zBgou>0U!(a3h`+{6z>YYs{-#{6b1&@pc^^C&<$t;iH(9Jx}cCiR~2HDf_wlg%mcX# zg7SJIg~CxmF@rV&F|0tLd_`gEw&O%S@2Pk5vH6X>w|>RcUyDZPnPW|9u5rKDnrjq; zJ?$o%?j?HAhb9EzF;3JCulLc^iihZoAO7)l28k995FJ5`6Nwj#M7zOFfV+e#-z*Vr z11_hD&Zdag;W-9-TYS*fh>imX!$jkC5uzq9QDcZ`Ki(TqXdiF@|Jx9-d5Gvdckybyoj-Cenew%^*BTxBu%nrGI=iO6>~K2Gj#b>0ZWNeZSfQmgqrEj!(x1=dfcgsojQufr;@|a%BcM{F^z<7AEvcvy+l2zJmP}{Y1m2&a-nnYgLqINp$6?&C7ZqgNZ z%aUMt)-2o-J$y(s>`;!Qe9r6Q)!ClMjd*p@De75M=a4Q&zR_*oTx?qQ_#UB6f1mm+ ze-(Et|Kn>kR!dOQ}2lk{PAiXfAFvU|XDv&j-Zoj{!@w;&-uUKhCI%v~w;mKf=;rCQ9YlIT(>Z_(}+J`s}WbD>vET4|$23skqC z#q^u0hF30F#;=8~%UHSkVm727AuR}TI2ZG^ux6^DA%;Q^KD%Z=k3{;bpI!V}L@a$9 zS!L0%{UDcVqBuP z#;ct|{o8RVgp*27t3s892~MVKc_hS;sSyMt2p$lQdyyq;xF8p znKEVOm?6_NPWj4PW@ZdpP3Dv$J?`9YX)@k2qx7!5&feeiJN){5_~XakYp=Z?-}Tsg zpOuGuucW^L-N%g>l{328*WBs+s`n+lcDnO_@n4+$@vIfm>z3hF)5EQ9-7b;^KU@8` z5C6&f!ZHiuWZKVGgiR#dC;V*n3K*~Kv?98zrAK7$&sLJ8W&LGSr}eF~R5pi;bhS>l z{9+aAvAyT5cv-$uMDs-9uhzACqWV@t{Hs-^#|q9{4uh)mR*B2N8T_uklGCkQx9;6S{Jx(C$rHUqA6XSEV)fc~pGaq-bRz0OM2FAzm#0I;5b$Z3=}6X4 zEwse-zBoBCQp6~E8@?3(-T$?OJ0QoUNILhX`Y^#{D9l9rrs@CR{dm7lY+nAtFn!JDje0`ML)R=-6&c zccE=3AzOA2$W~+IZR#P4yXuhH6LfI!)}F>(vL;`|%f!7}-k}$XJ2V5uw72q5CdnJu zEu@=2|IQ?tAL4b9V#!p)i7H-EUC19G6E9eOR{v_nIINVvH}%px?CK>h*E@9lsNH)R zt?kz>MCOHCW8_=cixeY*lCAk-y>kD>;wHl|PEHARd@RdDMV=XsH+Yb(q0msFh|ycr zTND|}IJqHK#IQdG)9y*Kw6}3 z7qN0>ALCY19U^t~F(L(GRNfH|kitK0;f7Qqre;LIkI?97M4(0r_8cy$BuX0DGbhsO zD@*!{R4qTSb08ADI0%5(qA1{%CL9B_MtQ&&t}rozcE})a=jG){Ux-HmpdnMCVcU!W zN`e41NT9VO#-LRh1P(nI^IHzhjWs4w#L9WBs&ZZqsag<4dCFDQ(6HY#`-(}f-<6eE zMrEZ@B%`!ytXO#=0%k%e#>F8Nn?p1l8sm^Ayrvr#57Qx6G{pz!io68m3gD?F!Nt>R z9TbyDyz!LtmW;hb_7@ON1r6g(1 z(Gvzh>H_2N^#gzo_$n#U_{z;d>k>f+WF-zXV=C%THt5)0H_$BiB!m7*NCs*rq?^f9 z68tsOlH`sgDDIUzG8uC3eOgDQOctfa&jEWU_`2@R`=pWmu2B2Tn$}P469`cRSa^yF zFvAhXWU@Y2}9Zs5ep`Ga+We0;FT)v_q?FzMOBqN1yOJW)FY zdZD^S4h3SXhiV4vhl&}R0nnbF29TlL?npxjsjy-jj3-^DD_zPWGGuZ((mmp?br=?T zVLW3vc2MP%CH`hOB=PJplXj379=Cpbiwo)40(#bFKu^dYmkGMEGQDGCrnt`-&tR`O z%V1A7Zq#%wSpW}pO9}Fs8$}e0T$C;DHVm>g@%P!{em#cPYV8PNS}Tm@=3uPxZN0Y5 z9ow5t8%?}PZ&Wi<)VLcZ$mCHXid`^^TyUGpeFe*{YgNhh^j*xP@*+EmQ|wHlokNMJ z^7TZSoMUDBlWRj{?q~x+S^p+&`Os+LP|qgn+nM?gzs+~xOf6jT7_mqT$4yA<5S^^f zjX@JqeIN0D_!7NBULw}&6^E~&iK$~n6z9TwXw!Kz=TZ^lKji;?(7w#2@1>ec`lX^l zb79es(*!Ge2XUECqMzD&LlBFaaoW~R<6NoDSowI2!B3$R;3t@qoxgPg9L*ETC#;0> z$vrYMSB#P;CWt9oM3-SM7@}@$%|+c{Rk9{(Rpt_}g`~3>sqTUC}>o!WwL9C>=`2SAA5Ropn2Ij^QUR&ES)A+ z1X^eOB0W*~d&FF@*Vd9jtTbzqd}|)$X7!LWw@>#7FQ;Cw`QCE97bcJ-b_OKz;^)W= z;0G>exEGU#8wfv@f0?KR39bxE8m25K%0{Am_0_3C2E+NOeJ0LNYK#|NOABA1g?-+b z60`*p-mr2cJeK^gp~?WWRb}8MV*5(NZ9(#|9T9;uDiCeV;&g>(F`rnx zOl}yMVcisn#$Xd|CaNVFR#Kca(qd z4zLGCn9GDah2OOl^$;e4ths?)0upWWT&TbK{sCpidttM7iX$(y#GwvpIgpabW z41za{uF@4tv#Sa^As1K8M=oa32Ucso_Y&W|#5Z!ZH75|81q-#u&s8JVk?wZf<;@rf zfjM^r9?Ai$7wBDXrd{?C-X<=dE|(OuhqQgxn|H~uhfn}j6mgi9(fmg$%qn+Ks_)W!t1}F9QKzJj z$=mJYtxS1*2^@jr){4bA4AB|Wu}IPqb9$6GIWf0<;&#O07AuT9~FcA`F(%qkC-xA);$VyD#_WLO7i1m&Q%%NGW0Rb!%njv3$#mX# znZ|R|GW6ZpsBSqnQWqU;n31IMH?r|b;gk7KiZpFJcKG_Iw7J(li4#5q%&hYY2up0P zgC%egk@J)nN{TZhrGR!nMMycEZ;h7OKf>U?A2gH-iQs#}e?igszR>B}K($ad2aj9!NudNWdO574?9&EpP6}Csc&h@+X zn$Ga7Yz9elmUL-6nk4%?jUZIg@caat|4He3G%GmOo6CXkpT^~Y*Gbh4#!2S3j7^Y5 zOgqU0@`fGO0RM@jA%R=tx}s(^po%^qTpG0uLzYr8JWo>IaHmgxAdMD^M7_gsg7!TF z8970Fn!IjSh%9K`wM94DGf1~&1*bieib*q1odtfkzT&~JYA+cd zGq;L+G-g%L$gaDa7^V`k_7q#U2InEqo#6ggP4q|-%7N0NCiL}iOyV|}3Dt4qHl!T( zHr^LTHKWENoxa_SbjtWdN|^g+;1fkU^ffRbH^$4QubDdbnt0uf(0DobFCvs4|&FMoBKU2FndDf#(>SO&<51oFe1@>~#ZPG}inTp@&mk z!gkn;RC8>&V>>R$RCQn(RdpDpWXyS=nz+*^yjys!(*8GC1u1^<8?d(*^WBlZj@3q<&C@1 zlr!g&J-SC&O^WA|=_9YR`pKnxaG+r-w1h=(p(R8HW4o2m@;ntEm9z5XqP<8(te3j4 zWr+^&#YvHa6jx()|K$d$slg?0BPqj;t#8APc=4%z$K)s!my_?HxL|4RJ}hO?abcGJ zE{KuV8I9`Y=L!N_#E9YY+`CW-I4j-n;>^5lwC+b=!>Z$cbmn_F-Xhy196+{#n7a-@ zOwK^3&Dpi$eM4+Y7YnJr#waBrb3Pm-vkyW@l_FLqSW&KAYMK1Zo>Mk##Upl0`ozwD< z&^fWGa3hrXF>ZuZQs%(8lv^^G7U1H4pa6Swb=yCXYSEEZeF9}Y zJ#C0!o47Cgokw60)RX%^MLlutc@%2_o#jUX9iSoXpFjgd zuKTA)WOhX4XV@3~R(xjo8KgU;pPONR&}Q_juNtaUJ@_G2C2Qj^j$^!-M;}9>2UgY` zgDgypt|0L^h?O$zL$%A@D!Gj~lhS1yr*4fRf(4X3&);AT=~^^AI&5l#4k#JJPM~C< zY;SkRl<8U5akR-o(lzqm8S<4+y}m^MoD9kr98x#m`L8JRhZZ_WJDl= z+KAnyJ{ns_3{DNn?mExHE&djpBKw7Y=Vm|iRJr9lG?lpDm~j&K8_M>a=oLIx$cmGq zzdyM>I;f@OOr=_N-n{%2I#QnSJVn)$)YZrMq6=zMD6m%Q)3Q~nL%Z2ZR%cvKG4bf` zcc=y!X$&iXrRg-l0t1ZefC0FD!ZXUz4p>3;GOY1kB#V@79b$}s&(9;}y941R)=Bm5 ztZdO4w6%&UZaB}JanBoc1<(5Z2l0HC^xt-Ssa$u)ldREKmHvQ&h9-y?t0w3 zRNOOcvuXD~suFSPE6W!YW~vKeGWBNmfH z>PFezNxesxD-mz(Zs~-kC{nq<03AwrwyzTYWrCG&j+N5&w$tP$mQFQAo0W94-boEo zlJ~~7(t%%LBsjSIJPho${15H~s#V@qKoL353jTft$!5jHw)uz{l_??AE_WL|XPeET_D#kxri|qEhDxYI2YcJ*`(ZDZ zXN1}2J1ty*ej5e`u+x2gJY!+%8%}Egkx8viNpwO2)d>S z&|$;eNY93x84tK)o`$uBgpeJltl_Q@D!%Y>;ISyX*s+rOoNZ^c%^z>enbEfXQrHZ0 z*bXJN4v~jStLbQ26=N>Zh$FtVEsn7Zwb>aQcy8MlW1Fu>6i{)ca$l@%u2g7&7#>bdkgMnn}0tdU)bRDNboDnB15 zqLmA*OS%#P#771ICJH*dQ1vw@s64%uoZ~uQdfJ|LWr@Z!ETVxZ>x;{!nt_3l6)%x( zBa>|N>Wvj_;e6WmE8^>~NK#4}wjQy*Cb3o~brlOz|2L^S@Lnr$ey`^mvCN00#}hap z9QE1en}6iCiWKBFBoR9`IEmDyLRGxlBo4CmXX_I6Y|S97CC!}%=5kW{lw3c^&hQ^E z>=W26z&ISHZw$sB-lSYK1WB1E)P)_}<7(pELH5XAXcYw3Z`JEFf%@|G-$YQgkU9|e b(OAXp>7hEDd#2fA-6;P)tKI@B3+xJkd+^kyWuGR;$-+zLxf(_^gLXOC;$zOlqqJz@3G#MMF=J!UP^V;w@2 zYr4n;Jyv6j8G%gC*_vs1h%g3g+%MAEala#F!ew)JF<8D8BC_1oU*Yw|_BOx&yG9eRvON7Ce%t^7GRpY}%wU(zjOmk`rGonbvo!KairpW4W z5i3{pF>WQ*AyP*lBT^tn<(=UGDg4tGZb&6!YI+3x2#tRGde0|vM4ov4%j=v*L82+CynfPrP^oK)P8E8K!_s1!c$Cu zN!}mTVp$4c(2=S=GKx4B%lZ`2S7xV*(K_g`j&~hPG*_!#BX|!L6N5#rmPLVwNzV=z6fDGk!M;by%g%#Ui9O*Jm=~5PvA(PXQ?h$vb!?4H; z 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 bjaA&99;(B+XPQ0Mjq*RF>EY@$JL&%chDTw_ diff --git a/RenX.Commands/RenX_Commands.cpp b/RenX.Commands/RenX_Commands.cpp index 77c6c4d..de8344d 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -16,7 +16,6 @@ * Written by Jessica James */ -#include #include "Jupiter/Functions.h" #include "Jupiter/SLList.h" #include "IRC_Bot.h"