00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "module.h"
00020
00021 #define AUTHOR "Rob"
00022 #define VERSION "$Id: os_info.c 1267 2007-08-26 18:43:43Z drstein $"
00023
00024
00025 #define DEFAULT_DB_NAME "os_info.db"
00026
00027
00028 #define LANG_NUM_STRINGS 10
00029
00030 #define OINFO_SYNTAX 0
00031 #define OINFO_ADD_SUCCESS 1
00032 #define OINFO_DEL_SUCCESS 2
00033 #define OCINFO_SYNTAX 3
00034 #define OCINFO_ADD_SUCCESS 4
00035 #define OCINFO_DEL_SUCCESS 5
00036 #define OINFO_HELP 6
00037 #define OCINFO_HELP 7
00038 #define OINFO_HELP_CMD 8
00039 #define OCINFO_HELP_CMD 9
00040
00041
00042
00043 char *OSInfoDBName = NULL;
00044
00045 int myAddNickInfo(User * u);
00046 int myAddChanInfo(User * u);
00047 int myNickInfo(User * u);
00048 int myChanInfo(User * u);
00049
00050 int mNickHelp(User * u);
00051 int mChanHelp(User * u);
00052 void mMainChanHelp(User * u);
00053 void mMainNickHelp(User * u);
00054 void m_AddLanguages(void);
00055
00056 int mLoadData(void);
00057 int mSaveData(int argc, char **argv);
00058 int mBackupData(int argc, char **argv);
00059 int mLoadConfig();
00060 int mEventReload(int argc, char **argv);
00061
00062
00063
00070 int AnopeInit(int argc, char **argv)
00071 {
00072 Command *c;
00073 EvtHook *hook = NULL;
00074
00075 int status = 0;
00076
00077 moduleAddAuthor(AUTHOR);
00078 moduleAddVersion(VERSION);
00079 moduleSetType(SUPPORTED);
00080
00081 alog("os_info: Loading configuration directives...");
00082 if (mLoadConfig()) {
00083 return MOD_STOP;
00084 }
00085
00086 c = createCommand("oInfo", myAddNickInfo, is_oper, -1, -1, -1, -1, -1);
00087 moduleAddHelp(c, mNickHelp);
00088 status += moduleAddCommand(NICKSERV, c, MOD_HEAD);
00089
00090 c = createCommand("Info", myNickInfo, NULL, -1, -1, -1, -1, -1);
00091 status += moduleAddCommand(NICKSERV, c, MOD_TAIL);
00092
00093 c = createCommand("oInfo", myAddChanInfo, is_oper, -1, -1, -1, -1, -1);
00094 moduleAddHelp(c, mChanHelp);
00095 status += moduleAddCommand(CHANSERV, c, MOD_HEAD);
00096
00097 c = createCommand("Info", myChanInfo, NULL, -1, -1, -1, -1, -1);
00098 status += moduleAddCommand(CHANSERV, c, MOD_TAIL);
00099
00100 hook = createEventHook(EVENT_DB_SAVING, mSaveData);
00101 status += moduleAddEventHook(hook);
00102
00103 hook = createEventHook(EVENT_DB_BACKUP, mBackupData);
00104 status += moduleAddEventHook(hook);
00105
00106 hook = createEventHook(EVENT_RELOAD, mEventReload);
00107 status += moduleAddEventHook(hook);
00108
00109 if (status != MOD_ERR_OK) {
00110 alog("os_info: ERROR when trying to create module commands. Unloading...");
00111 return MOD_STOP;
00112 }
00113
00114 moduleSetNickHelp(mMainNickHelp);
00115 moduleSetChanHelp(mMainChanHelp);
00116
00117 mLoadData();
00118 m_AddLanguages();
00119
00120 return MOD_CONT;
00121 }
00122
00126 void AnopeFini(void)
00127 {
00128 char *av[1];
00129
00130 av[0] = sstrdup(EVENT_START);
00131 mSaveData(1, av);
00132 free(av[0]);
00133
00134 if (OSInfoDBName)
00135 free(OSInfoDBName);
00136 }
00137
00138
00139
00150 int myAddNickInfo(User * u)
00151 {
00152 char *text = NULL;
00153 char *cmd = NULL;
00154 char *nick = NULL;
00155 char *info = NULL;
00156 NickAlias *na = NULL;
00157
00158
00159 text = moduleGetLastBuffer();
00160 if (text) {
00161 cmd = myStrGetToken(text, ' ', 0);
00162 nick = myStrGetToken(text, ' ', 1);
00163 info = myStrGetTokenRemainder(text, ' ', 2);
00164 if (cmd && nick) {
00165 if (strcasecmp(cmd, "ADD") == 0) {
00166
00167 if (info) {
00168
00169 if ((na = findnick(nick))) {
00170
00171 moduleAddData(&na->nc->moduleData, "info", info);
00172 moduleNoticeLang(s_NickServ, u,
00173 OINFO_ADD_SUCCESS, nick);
00174
00175 } else {
00176 notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED,
00177 nick);
00178 }
00179 free(info);
00180 }
00181 } else if (strcasecmp(cmd, "DEL") == 0) {
00182
00183 if ((na = findnick(nick))) {
00184 moduleDelData(&na->nc->moduleData, "info");
00185 moduleNoticeLang(s_NickServ, u,
00186 OINFO_DEL_SUCCESS, nick);
00187
00188 } else {
00189 notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED,
00190 nick);
00191 }
00192
00193 } else {
00194 moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
00195 }
00196 free(cmd);
00197 free(nick);
00198
00199 } else if (cmd) {
00200 moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
00201 free(cmd);
00202
00203 } else {
00204 moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
00205 }
00206 }
00207 return MOD_CONT;
00208 }
00209
00220 int myAddChanInfo(User * u)
00221 {
00222 char *text = NULL;
00223 char *cmd = NULL;
00224 char *chan = NULL;
00225 char *info = NULL;
00226 ChannelInfo *ci = NULL;
00227
00228
00229 text = moduleGetLastBuffer();
00230 if (text) {
00231 cmd = myStrGetToken(text, ' ', 0);
00232 chan = myStrGetToken(text, ' ', 1);
00233 info = myStrGetTokenRemainder(text, ' ', 2);
00234 if (cmd && chan) {
00235 if (strcasecmp(cmd, "ADD") == 0) {
00236 if (info) {
00237 if ((ci = cs_findchan(chan))) {
00238
00239 moduleAddData(&ci->moduleData, "info", info);
00240 moduleNoticeLang(s_ChanServ, u,
00241 OCINFO_ADD_SUCCESS, chan);
00242
00243 } else {
00244 notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED,
00245 chan);
00246 }
00247 free(info);
00248 }
00249 } else if (strcasecmp(cmd, "DEL") == 0) {
00250 if ((ci = cs_findchan(chan))) {
00251
00252 moduleDelData(&ci->moduleData, "info");
00253 moduleNoticeLang(s_ChanServ, u,
00254 OCINFO_DEL_SUCCESS, chan);
00255
00256 } else {
00257 notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED,
00258 chan);
00259 }
00260
00261 } else {
00262 moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
00263 }
00264 free(cmd);
00265 free(chan);
00266
00267 } else if (cmd) {
00268 moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
00269 free(cmd);
00270
00271 } else {
00272 moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
00273 }
00274 }
00275 return MOD_CONT;
00276 }
00277
00278
00279
00285 int myNickInfo(User * u)
00286 {
00287 char *text = NULL;
00288 char *nick = NULL;
00289 char *info = NULL;
00290 NickAlias *na = NULL;
00291
00292
00293 if (is_oper(u)) {
00294
00295 text = moduleGetLastBuffer();
00296 if (text) {
00297 nick = myStrGetToken(text, ' ', 0);
00298 if (nick) {
00299
00300 if ((na = findnick(nick))) {
00301
00302 if ((info = moduleGetData(&na->nc->moduleData, "info"))) {
00303 notice_user(s_NickServ, u, " OperInfo: %s", info);
00304 free(info);
00305 }
00306
00307 } else {
00308
00309 }
00310 free(nick);
00311 }
00312 }
00313 }
00314 return MOD_CONT;
00315 }
00316
00322 int myChanInfo(User * u)
00323 {
00324 char *text = NULL;
00325 char *chan = NULL;
00326 char *info = NULL;
00327 ChannelInfo *ci = NULL;
00328
00329
00330 if (is_oper(u)) {
00331
00332 text = moduleGetLastBuffer();
00333 if (text) {
00334 chan = myStrGetToken(text, ' ', 0);
00335 if (chan) {
00336 if ((ci = cs_findchan(chan))) {
00337
00338 if ((info = moduleGetData(&ci->moduleData, "info"))) {
00339 notice_user(s_ChanServ, u, " OperInfo: %s", info);
00340 free(info);
00341 }
00342 }
00343 free(chan);
00344 }
00345 }
00346 }
00347 return MOD_CONT;
00348 }
00349
00350
00351
00356 int mLoadData(void)
00357 {
00358 int ret = 0;
00359 FILE *in;
00360
00361 char *type = NULL;
00362 char *name = NULL;
00363 char *info = NULL;
00364 int len = 0;
00365
00366 ChannelInfo *ci = NULL;
00367 NickAlias *na = NULL;
00368
00369
00370 char buffer[2000];
00371 if ((in = fopen(OSInfoDBName, "r")) == NULL) {
00372 alog("os_info: WARNING: can not open the database file! (it might not exist, this is not fatal)");
00373 ret = 1;
00374 } else {
00375 while (fgets(buffer, 1500, in)) {
00376 type = myStrGetToken(buffer, ' ', 0);
00377 name = myStrGetToken(buffer, ' ', 1);
00378 info = myStrGetTokenRemainder(buffer, ' ', 2);
00379 if (type) {
00380 if (name) {
00381 if (info) {
00382 len = strlen(info);
00383
00384 info[len - 1] = '\0';
00385 if (stricmp(type, "C") == 0) {
00386 if ((ci = cs_findchan(name))) {
00387 moduleAddData(&ci->moduleData, "info",
00388 info);
00389 }
00390 } else if (stricmp(type, "N") == 0) {
00391 if ((na = findnick(name))) {
00392 moduleAddData(&na->nc->moduleData, "info",
00393 info);
00394 }
00395 }
00396 free(info);
00397 }
00398 free(name);
00399 }
00400 free(type);
00401 }
00402 }
00403 }
00404 return ret;
00405 }
00406
00414 int mSaveData(int argc, char **argv)
00415 {
00416 ChannelInfo *ci = NULL;
00417 NickCore *nc = NULL;
00418 int i = 0;
00419 int ret = 0;
00420 FILE *out;
00421 char *info = NULL;
00422
00423 if (argc >= 1) {
00424 if (!stricmp(argv[0], EVENT_START)) {
00425 if ((out = fopen(OSInfoDBName, "w")) == NULL) {
00426 alog("os_info: ERROR: can not open the database file!");
00427 anope_cmd_global(s_OperServ,
00428 "os_info: ERROR: can not open the database file!");
00429 ret = 1;
00430 } else {
00431 for (i = 0; i < 1024; i++) {
00432 for (nc = nclists[i]; nc; nc = nc->next) {
00433
00434 if ((info = moduleGetData(&nc->moduleData, "info"))) {
00435 fprintf(out, "N %s %s\n", nc->display, info);
00436 free(info);
00437 }
00438 }
00439 }
00440
00441
00442 for (i = 0; i < 256; i++) {
00443 for (ci = chanlists[i]; ci; ci = ci->next) {
00444
00445 if ((info = moduleGetData(&ci->moduleData, "info"))) {
00446 fprintf(out, "C %s %s\n", ci->name, info);
00447 free(info);
00448 }
00449 }
00450 }
00451 fclose(out);
00452 }
00453 } else {
00454 ret = 0;
00455 }
00456 }
00457
00458 return ret;
00459 }
00460
00465 int mBackupData(int argc, char **argv)
00466 {
00467 ModuleDatabaseBackup(OSInfoDBName);
00468
00469 return MOD_CONT;
00470 }
00471
00476 int mLoadConfig(void)
00477 {
00478 char *tmp = NULL;
00479
00480 Directive directivas[] = {
00481 {"OSInfoDBName", {{PARAM_STRING, PARAM_RELOAD, &tmp}}},
00482 };
00483
00484 Directive *d = &directivas[0];
00485 moduleGetConfigDirective(d);
00486
00487 if (OSInfoDBName)
00488 free(OSInfoDBName);
00489
00490 if (tmp) {
00491 OSInfoDBName = tmp;
00492 } else {
00493 OSInfoDBName = sstrdup(DEFAULT_DB_NAME);
00494 alog("os_info: OSInfoDBName is not defined in Services configuration file, using default %s", OSInfoDBName);
00495 }
00496
00497 alog("os_info: Directive OSInfoDBName loaded (%s)...", OSInfoDBName);
00498
00499 return 0;
00500 }
00501
00506 int mEventReload(int argc, char **argv)
00507 {
00508 int ret = 0;
00509 if (argc >= 1) {
00510 if (!stricmp(argv[0], EVENT_START)) {
00511 alog("os_info: Reloading configuration directives...");
00512 ret = mLoadConfig();
00513 } else {
00514
00515 }
00516 }
00517
00518 if (ret)
00519 alog("os_info.c: ERROR: An error has occured while reloading the configuration file");
00520
00521 return MOD_CONT;
00522 }
00523
00524
00525
00529 void m_AddLanguages(void)
00530 {
00531 char *langtable_en_us[] = {
00532
00533 "Syntax: OINFO [ADD|DEL] nick <info>",
00534
00535 "OperInfo line has been added to nick %s",
00536
00537 "OperInfo line has been removed from nick %s",
00538
00539 "Syntax: OINFO [ADD|DEL] chan <info>",
00540
00541 "OperInfo line has been added to channel %s",
00542
00543 "OperInfo line has been removed from channel %s",
00544
00545 "Syntax: OINFO [ADD|DEL] nick <info>\n"
00546 "Add or Delete Oper information for the given nick\n"
00547 "This will show up when any oper /ns info nick's the user.\n"
00548 "and can be used for 'tagging' users etc....",
00549
00550 "Syntax: OINFO [ADD|DEL] chan <info>\n"
00551 "Add or Delete Oper information for the given channel\n"
00552 "This will show up when any oper /cs info's the channel.\n"
00553 "and can be used for 'tagging' channels etc....",
00554
00555 " OINFO Add / Del an OperInfo line to a nick",
00556
00557 " OINFO Add / Del an OperInfo line to a channel"
00558 };
00559
00560 char *langtable_es[] = {
00561
00562 "Sintaxis: OINFO [ADD|DEL] nick <info>",
00563
00564 "Una linea OperInfo ha sido agregada al nick %s",
00565
00566 "La linea OperInfo ha sido removida del nick %s",
00567
00568 "Sintaxis: OINFO [ADD|DEL] chan <info>",
00569
00570 "Linea OperInfo ha sido agregada al canal %s",
00571
00572 "La linea OperInfo ha sido removida del canal %s",
00573
00574 "Sintaxis: OINFO [ADD|DEL] nick <info>\n"
00575 "Agrega o elimina informacion para Operadores al nick dado\n"
00576 "Esto se mostrara cuando cualquier operador haga /ns info nick\n"
00577 "y puede ser usado para 'marcado' de usuarios, etc....",
00578
00579 "Sintaxis: OINFO [ADD|DEL] chan <info>\n"
00580 "Agrega o elimina informacion para Operadores al canal dado\n"
00581 "Esto se mostrara cuando cualquier operador haga /cs info canal\n"
00582 "y puede ser usado para 'marcado' de canales, etc....",
00583
00584 " OINFO Agrega / Elimina una linea OperInfo al nick",
00585
00586 " OINFO Agrega / Elimina una linea OperInfo al canal"
00587 };
00588
00589 char *langtable_nl[] = {
00590
00591 "Gebruik: OINFO [ADD|DEL] nick <info>",
00592
00593 "OperInfo regel is toegevoegd aan nick %s",
00594
00595 "OperInfo regel is weggehaald van nick %s",
00596
00597 "Gebruik: OINFO [ADD|DEL] kanaal <info>",
00598
00599 "OperInfo regel is toegevoegd aan kanaal %s",
00600
00601 "OperInfo regel is weggehaald van kanaal %s",
00602
00603 "Gebruik: OINFO [ADD|DEL] nick <info>\n"
00604 "Voeg een Oper informatie regel toe aan de gegeven nick, of\n"
00605 "verwijder deze. Deze regel zal worden weergegeven wanneer\n"
00606 "een oper /ns info nick doet voor deze gebruiker, en kan worden\n"
00607 "gebruikt om een gebruiker te 'markeren' etc...",
00608
00609 "Gebruik: OINFO [ADD|DEL] kanaal <info>\n"
00610 "Voeg een Oper informatie regel toe aan de gegeven kanaal, of\n"
00611 "verwijder deze. Deze regel zal worden weergegeven wanneer\n"
00612 "een oper /cs info kanaal doet voor dit kanaal, en kan worden\n"
00613 "gebruikt om een kanaal te 'markeren' etc...",
00614
00615 " OINFO Voeg een OperInfo regel toe aan een nick of verwijder deze",
00616
00617 " OINFO Voeg een OperInfo regel toe aan een kanaal of verwijder deze"
00618 };
00619
00620 char *langtable_de[] = {
00621
00622 "Syntax: OINFO [ADD|DEL] Nickname <Information>",
00623
00624 "Eine OperInfo Linie wurde zu den Nicknamen %s hinzugefügt",
00625
00626 "Die OperInfo Linie wurde von den Nicknamen %s enfernt",
00627
00628 "Syntax: OINFO [ADD|DEL] Channel <Information>",
00629
00630 "Eine OperInfo Linie wurde zu den Channel %s hinzugefügt",
00631
00632 "Die OperInfo Linie wurde von den Channel %s enfernt",
00633
00634 "Syntax: OINFO [ADD|DEL] Nickname <Information>\n"
00635 "Addiert oder löscht eine OperInfo Linie zu den angegebenen\n"
00636 "Nicknamen.Sie wird angezeigt wenn ein Oper mit /ns info sich\n"
00637 "über den Nicknamen informiert.",
00638
00639 "Syntax: OINFO [ADD|DEL] chan <info>\n"
00640 "Addiert oder löscht eine OperInfo Linie zu den angegebenen\n"
00641 "Channel.Sie wird angezeigt wenn ein Oper mit /cs info sich\n"
00642 "über den Channel informiert.",
00643
00644 " OINFO Addiert / Löscht eine OperInfo Linie zu / von einen Nicknamen",
00645
00646 " OINFO Addiert / Löscht eine OperInfo Linie zu / von einen Channel"
00647 };
00648
00649 char *langtable_pt[] = {
00650
00651 "Sintaxe: OINFO [ADD|DEL] nick <informação>",
00652
00653 "A linha OperInfo foi adicionada ao nick %s",
00654
00655 "A linha OperInfo foi removida do nick %s",
00656
00657 "Sintaxe: OINFO [ADD|DEL] canal <informação>",
00658
00659 "A linha OperInfo foi adicionada ao canal %s",
00660
00661 "A linha OperInfo foi removida do canal %s",
00662
00663 "Sintaxe: OINFO [ADD|DEL] nick <informação>\n"
00664 "Adiciona ou apaga informação para Operadores ao nick fornecido\n"
00665 "Isto será mostrado quando qualquer Operador usar /ns info nick\n"
00666 "e pode ser usado para 'etiquetar' usuários etc...",
00667
00668 "Sintaxe: OINFO [ADD|DEL] canal <informação>\n"
00669 "Adiciona ou apaga informação para Operadores ao canal fornecido\n"
00670 "Isto será mostrado quando qualquer Operador usar /cs info canal\n"
00671 "e pode ser usado para 'etiquetar' canais etc...",
00672
00673 " OINFO Adiciona ou Apaga a linha OperInfo para um nick",
00674
00675 " OINFO Adiciona ou Apaga a linha OperInfo para um canal"
00676 };
00677
00678 char *langtable_it[] = {
00679
00680 "Sintassi: OINFO [ADD|DEL] nick <info>",
00681
00682 "Linea OperInfo aggiunta al nick %s",
00683
00684 "Linea OperInfo rimossa dal nick %s",
00685
00686 "Sintassi: OINFO [ADD|DEL] chan <info>",
00687
00688 "Linea OperInfo aggiunta al canale %s",
00689
00690 "Linea OperInfo rimossa dal canale %s",
00691
00692 "Sintassi: OINFO [ADD|DEL] nick <info>\n"
00693 "Aggiunge o rimuove informazioni Oper per il nick specificato\n"
00694 "Queste vengono mostrate quando un oper esegue il comando /ns info <nick>\n"
00695 "e possono essere utilizzate per 'marchiare' gli utenti ecc...",
00696
00697 "Sintassi: OINFO [ADD|DEL] chan <info>\n"
00698 "Aggiunge o rimuove informazioni Oper per il canale specificato\n"
00699 "Queste vengono mostrate quando un oper esegue il comando /cs info <canale>\n"
00700 "e possono essere utilizzate per 'marchiare' i canali ecc...",
00701
00702 " OINFO Aggiunge/Rimuove una linea OperInfo ad/da un nick",
00703
00704 " OINFO Aggiunge/Rimuove una linea OperInfo ad/da un canale"
00705 };
00706
00707 moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us);
00708 moduleInsertLanguage(LANG_ES, LANG_NUM_STRINGS, langtable_es);
00709 moduleInsertLanguage(LANG_NL, LANG_NUM_STRINGS, langtable_nl);
00710 moduleInsertLanguage(LANG_DE, LANG_NUM_STRINGS, langtable_de);
00711 moduleInsertLanguage(LANG_PT, LANG_NUM_STRINGS, langtable_pt);
00712 moduleInsertLanguage(LANG_IT, LANG_NUM_STRINGS, langtable_it);
00713 }
00714
00715
00716
00717 int mNickHelp(User * u)
00718 {
00719 if (is_oper(u)) {
00720 moduleNoticeLang(s_NickServ, u, OINFO_HELP);
00721 } else {
00722 notice_lang(s_NickServ, u, NO_HELP_AVAILABLE, "OINFO");
00723 }
00724 return MOD_CONT;
00725 }
00726
00727 int mChanHelp(User * u)
00728 {
00729 if (is_oper(u)) {
00730 moduleNoticeLang(s_ChanServ, u, OCINFO_HELP);
00731 } else {
00732 notice_lang(s_ChanServ, u, NO_HELP_AVAILABLE, "OINFO");
00733 }
00734 return MOD_CONT;
00735 }
00736
00737
00738 void mMainNickHelp(User * u)
00739 {
00740 if (is_oper(u)) {
00741 moduleNoticeLang(s_NickServ, u, OINFO_HELP_CMD);
00742 }
00743 }
00744
00745
00746 void mMainChanHelp(User * u)
00747 {
00748 if (is_oper(u)) {
00749 moduleNoticeLang(s_ChanServ, u, OCINFO_HELP_CMD);
00750 }
00751 }
00752
00753
00754
00755