From 3a258520bcdbb794529a85b763f98995a0f6c227 Mon Sep 17 00:00:00 2001 From: timriker Date: Wed, 12 Nov 2003 00:15:07 +0000 Subject: [PATCH] hide old cruft in cvs git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk/blootbot@881 c11ca15a-4712-0410-83d8-924469b57eb5 --- doc/old/BUGS | 104 ----- doc/old/EXAMPLES | 50 --- doc/old/FAQ | 23 - doc/old/TODO | 113 ----- doc/old/TODO_2000 | 113 ----- doc/old/TODO_2001 | 80 ---- doc/old/USAGE | 714 ------------------------------ doc/old/notes.txt | 111 ----- old/Freshmeat_I.pl | 270 ----------- old/Freshmeat_II.pl | 359 --------------- old/News.pl | 1031 ------------------------------------------- old/dbm.pl | 445 ------------------- 12 files changed, 3413 deletions(-) delete mode 100644 doc/old/BUGS delete mode 100644 doc/old/EXAMPLES delete mode 100644 doc/old/FAQ delete mode 100644 doc/old/TODO delete mode 100644 doc/old/TODO_2000 delete mode 100644 doc/old/TODO_2001 delete mode 100644 doc/old/USAGE delete mode 100644 doc/old/notes.txt delete mode 100644 old/Freshmeat_I.pl delete mode 100644 old/Freshmeat_II.pl delete mode 100644 old/News.pl delete mode 100644 old/dbm.pl diff --git a/doc/old/BUGS b/doc/old/BUGS deleted file mode 100644 index 72f3449..0000000 --- a/doc/old/BUGS +++ /dev/null @@ -1,104 +0,0 @@ - KNOWN PROBLEMS AND BUGS - -Problem #1: - 'topic [#channel] shuffle' will produce 1 in n! (where n - is number of subtopics in topic. IS THIS CORRECT PROBABILITY?) - chance that it will be the same as before. - - If someone wants to experiment a fix for this, do so. - Here is a hint: - 'while (!defined $newtopic || $topic{$talkchannel} eq $newtopic) {' - -Problem #2: [UPDATED 20000224] - A race condition is observed if the topic is changed very - quickly. If the bot is told to change the topic twice but - has not received notification of the new topic before - changing to the second modification of the topic, it - would use the absolute first (0) topic as a reference, - therefore missing out on the first alteration of the - topic. - - A very cheap solution exists. Edit IrcHooks.pl, search for - 'topic', alter '1' to '0'. This will only cache topics made by the - bot (I hope). I have a faint feeling that bot-only topics are - stored elsewhere (history I think) but I'm not quite sure. - - Yet another (ultimate and preferable) solution would be to have - topic queueing, altering the topic once the first alteration has - been done, changing the topic until the queue is empty. However, - topic floods will eventuate unfortunately. If a queue of 2 or more - is detected, no more topic changes are done until a time of - 5-10seconds (how can this be done?). This is a challenge to - implement. - -Problem #3: 19991110 - It appears that if the last string separated by a whitespace - of the topic will be chopped off (if it's "()") because the - ownership is null. At first I thought it was a bug in the regex - but it was okay. I guess it's a minor problem but why should - there be a semi-ownerless subtopic :) If it's annoying, please - investigate the &topicCipher() function in Topic.pl in relation to - &topicDecipher(). - -Problem #4: 199912xx - mysql overload... - - DBD::mysql::st execute failed: Duplicate entry 'xk' for key 1 at - ./src/Freshmeat.pl line 85. - when freshmeat.pl is building the table and something's said in the - channel... seen code tries to update table but fails. - - [UPDATE 20000224] - This may be eliminated by reducing 4-5 INSERT/UPDATE requests to - just 1 (total of 2), depending on the return of SELECT. If this - still persists and memory leaks are happening, first make - sure you are not using broken mysql tables, secondly bitch at the - mysql-perl author that there is a memory leak when a broken table - is in use. - -Problem #5: - doWarn is called when perl catches a "warning". - - => - [ 44] !WARN! PERL: Use of uninitialized value at ./src/Modules.pl line 316. - [ 45] !WARN! PERL: offending line => ' if ($query eq "") {'. - [ 46] !DEBUG! test1. - [ 47] !DEBUG! test2. - [ 48] !DEBUG! test3. - - ### From 'perlfunc'... - Note that this is quite safe and will not produce an endless loop, - since __WARN__ hooks are not called from inside one. - - ### From 'perlvar'... - Note that __DIE__/__WARN__ handlers are very special in one - respect: they may be called to report (probable) errors found by - the parser. In such a case the parser may be in inconsistent - state, so any attempt to evaluate Perl code from such a handler - will probably result in a segfault. - -Problem #6: -! 14! Debian: 12.87 sec to complete query. -! 15! Debian Search of 'testing' (2 shown): ... -[ 38] disconnect from irc.home.org (Connection reset by peer). -[ 39] reconnection... cleaning out channel cache. - - Solution #6: - Edit /usr/lib/perl5/Net/IRC.pm - Comment out *->quit() on 'sub DESTROY' - Alternatively, bitch at author of Net::IRC. - -Problem #7: why... - <\ifvoid> apt, cellwave? - i haven't a clue, \ifvoid - bugger all, i dunno, \ifvoid - -Problem #8: - apt: lart - * apt/#debian strangles with a doohicky mouse cord - -Problem #9: - [Flugh] i say 'rom, rom is a mud server', it says 'ok'. then - 'rom, rom?' it says 'yes? ' - -# info package dist doesn't recognise dist. diff --git a/doc/old/EXAMPLES b/doc/old/EXAMPLES deleted file mode 100644 index ef12862..0000000 --- a/doc/old/EXAMPLES +++ /dev/null @@ -1,50 +0,0 @@ - EXAMPLES - last updated 16.03.2000 - written by xk - - blootbot: test is testing - me: okay - blootbot: testing? - testing is testing - - blootbot: tests is testing - me: okay - blootbot: tests? - testing - - blootbot: cough is coughs - me: okay - blootbot: cough -* blootbot/#blootbot coughs - - blootbot: test is What's (one|two|three|four|five|six) - times (seven|eight|nine|ten|eleven|twelve)? - okay, me - blootbot: test - What's four times nine? - blootbot: test? - What's six times ten? - - blootbot: op me is Mode change "+o $nick" on channel - $channel by $ident - me: okay - blootbot: op me -* blootbot/#debian-bots Mode change "+o me" on channel #blootbot by - blootbot - - blootbot: no who am i is You are $nick!$user@$host on - $channel. - okay, me - blootbot: who am i - You are me!me@home.org on #blootbot. - - blootbot: who last spoke is To my knowledge, $lastspeaker - was the last to say something worthwhile. - me: okay - blootbot: who last spoke - To my knowledge, me was the last to say something worthwhile. - - blootbot: percentage is you are $randpercentage% lame - me: okay - blootbot: percentage - you are 79% lame diff --git a/doc/old/FAQ b/doc/old/FAQ deleted file mode 100644 index ac1aeef..0000000 --- a/doc/old/FAQ +++ /dev/null @@ -1,23 +0,0 @@ -Q: The bot exits after I run 'factstats testing' or 'kernel' or anything - that uses fork(). Is this a bug in the bot? - -A: No, this is not a bug in the bot but rather Net::IRC. A cheap hack is - to edit /usr/lib/perl5/Net/IRC/Connection.pm, search for DESTROY, and - comment out '$self->quit();' -A: Apply the patches in the patches/ directory. - - -Q: I notice that, in the bot logs, the bot attempts to close all current - DCC CHAT connections whenever a forked process ends. Why is this? - -A: Yet another bug in Net::IRC. Currently, DCC CHAT connections are not - closed because there is an endless-loop bug when it is done. - - -Q: I executed 'scripts/setup_user.pl' but it said 'connection refused to - localhost' - -A: Looks like a bug in the installation of mysqld. You need to reload or - restart the daemon. - reload => 'mysqladmin -u root -p reload' - restart => '/etc/init.d/mysql stop; /etc/init.d/mysql start' diff --git a/doc/old/TODO b/doc/old/TODO deleted file mode 100644 index bc5e23f..0000000 --- a/doc/old/TODO +++ /dev/null @@ -1,113 +0,0 @@ -######### TODO. -### WISHLIST: SCHEDULER RELATED. -- if topic -CMD is used, schedule the change for 10seconds later. - $schedule{topicchange}{$chan} = SID. use 'dequeue' to delete. -- if 50% of netsplit victims come back, set a timer for 60seconds to - delete those who have not come back from the split. -- make first run of schedulers skip so they don't run all at once. - use 'return' if (ref($_[0]) eq ???); => won't work? -- use topic-queue for 'topic *'. -- Add &schedulerAdd() and &schedulerDel();, &scheduleIsInQueue(); -- rename &ScheduleThis() to &scheduleAdd(); - -### WISHLIST: COMMAND HOOKS. -- play around with 'hook' idea, see header of CommandStubs.pl. -- hook for ALL commands through MESSAGES. -- factoids to take arguments such as $1 $2 ... - => check all factoids for hooks then append to hook list. - -### WISHLIST: OLDE DBM SUPPORT // PGSQL. -- Thoroughly test both... core features done though. -- make a sql_common.pl file for 90% common stuff between mysql/pgsql. -- pgsql and mysql can be merged but I dunno anything about pgsql :) -- PGSQL - - EVERYTHING -- DBM - --- searchTable can be optimized by determining the correct offset - and use that from then on. - - Adding factoids [OK] - - Deleting factoids [OK] - - FactInfo [OK] - - Seen [OK] - - SearchTable [OK] -- "%","*" supported? - - Countdown [???] - - Freshmeat [???] -- &dbSetRow() should work, but slow. - - Factstats unrequested [???] - -### WISHLIST: SHOULD BE DONE... -- Change ""return 'NOREPLY';"" to ""return $noreply;"". -- make use of &status() in setup_*.pl -- Add quotes (Finance::Quote) support. -- Debian module doesn't search non-free or non-us properly. -- send DCC message when using 'op'. -- Schedule a 5min(??) interval to display stats in DCC - - kill if dcc chat == gone. - - add schedule list. -- if 25lines are logged within 1 second, throttle it (sleep 1) -- Add &botstatsUpdate() &botstatsGet(); -- Create startCheck(); for once off startup checks. -- Max size of logs to keep. - - use Maxlogsize for both compressed and uncompressed. -- split Process.pl's FactoidStuph() off to Factoids/FCommands.pl -- time when last executed commands like fm,/. Useless? -- if a dunno is issued, add an option to suggest a factiod - => IE: fm - - $fact =~ / blah|blah / or /\Wblah\W/ ?? - - debian package. ?? - - ... -- add a function to evaluate channels - - ie: 'ALL', 'ALL but #blah', '#blah1 #blah2', - => Added &makeChanList() but not using it yet. -- rename performStrictReply to performReplyAsIs() or something? -- show current stats for top 3 requesters and top 3 requests. - => when seen is used, show last factoid/cmd asked -- understand '\' in infobot.config. -- Create a script to insert initial factoids like 'status','hello'... - like the dbm script in the old days. -- Add 'heh' count, like on 'dpkg', to &on_public(). create generic table - to handle this and karma and probably total msg count. possibly - integrate with seen table? - .... UPDATE seen SET time=time+1 WHERE nick='xk'; - .... ERROR 1064: parse error near '+1 WHERE nick='xk'' at line 1 - => WHY? -- support for 'find blah 6' for items 6 and more (since the list is - ordered). requested by jim. -- support 'info package [dist] [section]', eg: 'info ssh non-free' or - support query for incoming, if dist!=incoming. -- ... - -### WISHLIST: something to be desired... -- 'tell' (Process.pl) to support commands. -- reject ' see' if redir factoid is too long. - need parsing of '||' and '(1|2|...)', too, for all possible - combinations (or permutations?). -- download *.dsc and *.changes file to generate the Incoming Packages - file. This will be fun :) -- Add 'OverwriteFromTxt' and other options for txt2mysql.pl. -- Set some variable to say "yes, I'm quitting" to prevent log compression - since it imposes a perl warning "unreferenced scalar"... -- Universal FROM<->TO conversion script for factoid table/db. -### CLEAN UP -- Split all the functions in Topic.pl to topic . First chunk of - commands should be "Internal", the next chunk "Helpers" and the - last one is "Main". -- Reduce number of global variables used. - => convert hash lists to arrays. - => convert scalar vars to hash lists. - -### CHALLENGE -- Better method to store topics. Should be very similiar to the - joinnextchan code, but a topic queue. _however_, topic may be lost with - netsplit + stuff which is another problem, oh well. - How do IRC clients do it? set a timer for 0.5s before any changes? -- Tree to show all variables in use. preliminary stuff there but - it's not all that helpful. good oreilly stuff in scripts/ -- Better netjoin detection code. -- Allow X number of repetition of messages, default cannot be changed due - to simplicity of current code. - -### EXTERNAL BUGS: -- Net::IRC doesn't know event 'pong'. - -### BROKEN: -- babelfish diff --git a/doc/old/TODO_2000 b/doc/old/TODO_2000 deleted file mode 100644 index bc5e23f..0000000 --- a/doc/old/TODO_2000 +++ /dev/null @@ -1,113 +0,0 @@ -######### TODO. -### WISHLIST: SCHEDULER RELATED. -- if topic -CMD is used, schedule the change for 10seconds later. - $schedule{topicchange}{$chan} = SID. use 'dequeue' to delete. -- if 50% of netsplit victims come back, set a timer for 60seconds to - delete those who have not come back from the split. -- make first run of schedulers skip so they don't run all at once. - use 'return' if (ref($_[0]) eq ???); => won't work? -- use topic-queue for 'topic *'. -- Add &schedulerAdd() and &schedulerDel();, &scheduleIsInQueue(); -- rename &ScheduleThis() to &scheduleAdd(); - -### WISHLIST: COMMAND HOOKS. -- play around with 'hook' idea, see header of CommandStubs.pl. -- hook for ALL commands through MESSAGES. -- factoids to take arguments such as $1 $2 ... - => check all factoids for hooks then append to hook list. - -### WISHLIST: OLDE DBM SUPPORT // PGSQL. -- Thoroughly test both... core features done though. -- make a sql_common.pl file for 90% common stuff between mysql/pgsql. -- pgsql and mysql can be merged but I dunno anything about pgsql :) -- PGSQL - - EVERYTHING -- DBM - --- searchTable can be optimized by determining the correct offset - and use that from then on. - - Adding factoids [OK] - - Deleting factoids [OK] - - FactInfo [OK] - - Seen [OK] - - SearchTable [OK] -- "%","*" supported? - - Countdown [???] - - Freshmeat [???] -- &dbSetRow() should work, but slow. - - Factstats unrequested [???] - -### WISHLIST: SHOULD BE DONE... -- Change ""return 'NOREPLY';"" to ""return $noreply;"". -- make use of &status() in setup_*.pl -- Add quotes (Finance::Quote) support. -- Debian module doesn't search non-free or non-us properly. -- send DCC message when using 'op'. -- Schedule a 5min(??) interval to display stats in DCC - - kill if dcc chat == gone. - - add schedule list. -- if 25lines are logged within 1 second, throttle it (sleep 1) -- Add &botstatsUpdate() &botstatsGet(); -- Create startCheck(); for once off startup checks. -- Max size of logs to keep. - - use Maxlogsize for both compressed and uncompressed. -- split Process.pl's FactoidStuph() off to Factoids/FCommands.pl -- time when last executed commands like fm,/. Useless? -- if a dunno is issued, add an option to suggest a factiod - => IE: fm - - $fact =~ / blah|blah / or /\Wblah\W/ ?? - - debian package. ?? - - ... -- add a function to evaluate channels - - ie: 'ALL', 'ALL but #blah', '#blah1 #blah2', - => Added &makeChanList() but not using it yet. -- rename performStrictReply to performReplyAsIs() or something? -- show current stats for top 3 requesters and top 3 requests. - => when seen is used, show last factoid/cmd asked -- understand '\' in infobot.config. -- Create a script to insert initial factoids like 'status','hello'... - like the dbm script in the old days. -- Add 'heh' count, like on 'dpkg', to &on_public(). create generic table - to handle this and karma and probably total msg count. possibly - integrate with seen table? - .... UPDATE seen SET time=time+1 WHERE nick='xk'; - .... ERROR 1064: parse error near '+1 WHERE nick='xk'' at line 1 - => WHY? -- support for 'find blah 6' for items 6 and more (since the list is - ordered). requested by jim. -- support 'info package [dist] [section]', eg: 'info ssh non-free' or - support query for incoming, if dist!=incoming. -- ... - -### WISHLIST: something to be desired... -- 'tell' (Process.pl) to support commands. -- reject ' see' if redir factoid is too long. - need parsing of '||' and '(1|2|...)', too, for all possible - combinations (or permutations?). -- download *.dsc and *.changes file to generate the Incoming Packages - file. This will be fun :) -- Add 'OverwriteFromTxt' and other options for txt2mysql.pl. -- Set some variable to say "yes, I'm quitting" to prevent log compression - since it imposes a perl warning "unreferenced scalar"... -- Universal FROM<->TO conversion script for factoid table/db. -### CLEAN UP -- Split all the functions in Topic.pl to topic . First chunk of - commands should be "Internal", the next chunk "Helpers" and the - last one is "Main". -- Reduce number of global variables used. - => convert hash lists to arrays. - => convert scalar vars to hash lists. - -### CHALLENGE -- Better method to store topics. Should be very similiar to the - joinnextchan code, but a topic queue. _however_, topic may be lost with - netsplit + stuff which is another problem, oh well. - How do IRC clients do it? set a timer for 0.5s before any changes? -- Tree to show all variables in use. preliminary stuff there but - it's not all that helpful. good oreilly stuff in scripts/ -- Better netjoin detection code. -- Allow X number of repetition of messages, default cannot be changed due - to simplicity of current code. - -### EXTERNAL BUGS: -- Net::IRC doesn't know event 'pong'. - -### BROKEN: -- babelfish diff --git a/doc/old/TODO_2001 b/doc/old/TODO_2001 deleted file mode 100644 index 5bdfc2e..0000000 --- a/doc/old/TODO_2001 +++ /dev/null @@ -1,80 +0,0 @@ -CVS COMMIT: - - - -TODO: - - make sure scheduler design is _right_ - it's broken'ish. - - debian BTS frontend "bugs" - - !country - - !dinstall - - support DCC SEND of factoid (listkeys/listvals) that matched. - - news: show total requested count, users "registered", users - "ignored" - - add notes about news redesign to accomodate individual items - read - need to add id's to each item too. - - debian bug lookup. - - bind DCC CHAT service to port. - - man perlipc, search for service. - - do forking aswell. - - debian: "find -2.4.1" does not work but 2.4.1 does? - - $debug var needed. - - check if debian downloading files are proper. - - verbose: say why config option was enabled/enabled. - - registered flags for users/channels - - end of DynaConfig.pl - - use in UserDCC.. warn if value is not in list. - - add &checkSet() or &_chanset(); - - update sample.chan and sample.config - - attempt to move userDCC to hooks. - - need to modify parseCmdHooks for user flags? - - make timers below 5 or 10 mins non-random values. --- EFFORT 1. - - make IRC/Schedulers.pl work 100%. - - intervals must be multiple of the smallest one - - otherwise auto-fixed. - - make intervals chan-specific - - need to store info in $sched{$what}{$chan} = - time(); when last run or next run? ----------------------------------------------------- ------------- FUTURE, NON-IMPORTANT - - ~country ua - - xk: add it :) and my imdb feature :) - - xk: and ~bugs :) - - stats to keep common words. - - "heh", "?", "lol", ":)", "hi" - - "HACKING" text file, documentation of where things start, - what "core" or reuseable functions are used and what for. - - web interface... learn php + tables. - - on join message - customizeable, option. - - addon to UserInfo but for channels? - - ^B's are removed (HOW?) from factoids. - - asking questions.... make more guesses - - throttling of "help topic": push-pull system of &msg(). - - one key for berk db to show format... - - use autoloader properly. - - Module:::: - - make a global autoloader. - - support notification of author of deleted factoids, - - flag to hide owner of factoid. - - table data for DCC CHAT or misc table. - - DYNAMIC USER//CONFIGURATION FILE UPGRADE: - - finer granuality(sp) of userlist/ignore file - - apt, find netconfig -- merge similar files. - - and same files(1 per package) for multiple packages. - - merge partial similar paths together. - - do some test cases to confirm code actually works as - proposed. - -------------------- useless statistics -- 20010420: -[router] [~blootbot/src] # grep DEBUG `find -type f`| wc -l - 373 -[router] [~blootbot/src] # grep WARN `find -type f` | wc -l - 129 -[router] [~blootbot/src] # grep FIXME `find -type f` | wc -l - 35 -[router] [~blootbot/src] # grep status `find -type f` | wc -l - 386 -[router] [~blootbot/src] # grep ERROR `find -type f` | wc -l - 145 - diff --git a/doc/old/USAGE b/doc/old/USAGE deleted file mode 100644 index d922ed7..0000000 --- a/doc/old/USAGE +++ /dev/null @@ -1,714 +0,0 @@ -========================================================================== -= === ======== ==== === == ==== === = -= === == ======= === == === ===== ===== === == === ===== ==== -= === ======= === == === ===== ===== === === ===== ==== -= === == ======= === == === ===== ===== === == === ===== ==== -= === === ==== ====== ===== ==== ====== ==== -========================================================================== - - ====================================== - USER COMMANDS - ====================================== - -Command: 4op -============= -Description: - ... - -Usage: REQUIRES +o flag. - 4op ... - -Example: - ... - - -Command: dumpvars -============= -Description: - ... - -Usage: REQUIRES +o flag. - dumpvars ... - -Example: - ... - - -Command: kick -============= -Description: - ... - -Usage: REQUIRES +o flag. - kick ... - -Example: - ... - - -Command: ignore -============= -Description: - ... - -Usage: REQUIRES +o flag. - ignore ... - -Example: - ... - - -Command: ignorelist -============= -Description: - ... - -Usage: REQUIRES +o flag. - ignorelist ... - -Example: - ... - - -Command: unignore -============= -Description: - ... - -Usage: REQUIRES +o flag. - unignore ... - -Example: - ... - - -Command: clear ignorelist -============= -Description: - ... - -Usage: REQUIRES +o flag. - clear ignorelist ... - -Example: - ... - - -Command: lobotomy -============= -Description: - ... - -Usage: REQUIRES +o flag. - lobotomy ... - -Example: - ... - - -Command: unlobotomy -============= -Description: - ... - -Usage: - unlobotomy ... - -Example: - ... - - -Command: op -============= -Description: - ... - -Usage: REQUIRES +o flag. - op ... - -Example: - ... - - -Command: say -============= -Description: - ... - -Usage: REQUIRES +o flag. - say ... - -Example: - ... - - -Command: die -============= -Description: - ... - -Usage: REQUIRES +n flag. - die ... - -Example: - ... - - -Command: jump -============= -Description: - ... - -Usage: REQUIRES +n flag. - jump ... - -Example: - ... - - -Command: rehash -============= -Description: - ... - -Usage: REQUIRES +n flag. - rehash ... - -Example: - ... - - -Command: set -============= -Description: - ... - -Usage: REQUIRES +n flag. - set ... - -Example: - ... - - -Command: unset -============= -Description: - ... - -Usage: REQUIRES +n flag. - unset ... - -Example: - ... - - -Command: chanstats -============= -Description: - Channel statistics is gathered while the bot is operation in those - channels it is located. They include: join, part, kick, ban, and - countless others. - -Usage: - chanstats [#channel] - -Example: - > blootbot: chanstats - i am on 2 channels: #blootbot #debian - i've cached 5 users distributed over 2 channels. - - > blootbot: chanstats #blootbot - On #blootbot, there have been 1 Join, 1 Op and 20 - PublicMsgs. - At the moment, 3 Opped and 3 Total. - - -Command: cmdstats -============= -Description: - ... - -Usage: - cmdstats ... - -Example: - ... - - -Command: crypt -============= -Description: - ... - -Usage: - crypt ... - -Example: - ... - - -Command: factinfo -============= -Description: - ... - -Usage: - factinfo ... - -Example: - ... - - -Command: factstats -============= -Description: - ... - -Usage: - factstats ... - -Example: - ... - - -Command: karma -============= -Description: - ... - -Usage: - karma ... - -Example: - ... - - -Command: spell -============= -Description: - ... - -Usage: - spell ... - -Example: - ... - - -Command: nslookup -============= -Description: - ... - -Usage: - nslookup ... - -Example: - ... - - -Command: part -============= -Description: - ... - -Usage: - part ... - -Example: - ... - - -Command: rot13 -============= -Description: - ... - -Usage: - rot13 ... - -Example: - ... - - -Command: wantNick -============= -Description: - ... - -Usage: - wantNick ... - -Example: - ... - - -Command: join -============= -Description: - The bot can be commanded to join a channel if it is not already on - there in the case of a kick/ban, invite only or invalid key to - name a few typical case scenarios. - - The channels which the bot can join is governed by the - configuration parameter labelled 'join_channels'. However, this - is ignored for those users with the +o flag in the user table. - -Usage: - join <#channel>[,key] - -Example: - > blootbot: join #blootbot - [blootbot] joining #blootbot - *** join/#debian blootbot (bot@router.home.org) - > blootbot: join #blootbot - [blootbot] I'm already on #blootbot... - - - - ====================================== - MODULE COMMANDS - ====================================== - -Command: babelfish -============= -Description: - ... - -Usage: - x from [language]: phrase - -Example: - ... - - -Command: debian package -============= -Description: - ... - -Usage: - [] ... - -Example: - ... - - -Command: dict -============= -Description: - ... - -Usage: - dict ... - -Example: - ... - - -Command: freshmeat -============= -Description: - ... - -Usage: - freshmeat ... - -Example: - ... - - -Command: google -============= -Description: - ... - -Usage: - google ... - -Example: DOES NOT WORK YET(??) - ... - - -Command: insult -============= -Description: - ... - -Usage: - insult ... - -Example: - ... - - -Command: kernel -============= -Description: - ... - -Usage: - kernel ... - -Example: - ... - - -Command: lart -============= -Description: - ... - -Usage: - lart ... - -Example: - ... - - -Command: list{keys|vals} -============= -Description: - ... - -Usage: - list{keys|vals} ... - -Example: - ... - - -Command: nickometer -============= -Description: - ... - -Usage: - nickometer ... - -Example: - ... - - -Command: quotes -============= -Description: - ... - -Usage: - quotes ... - -Example: - ... - - -Command: rootwarn -============= -Description: - ... - -Usage: - rootwarn ... - -Example: - ... - - -Command: seen -============= -Description: - ... - -Usage: - seen ... - -Example: - ... - - -Command: listauth -============= -Description: - ... - -Usage: - listauth ... - -Example: - ... - - -Command: slashdot -============= -Description: - ... - -Usage: - slashdot ... - -Example: - ... - - -Command: debian contents -============= -Description: - ... - -Usage: - debian ... - -Example: - ... - - -Command: topic -============= -Description: - ... - -Usage: - topic ... - -Example: - ... - - -Command: countdown -============= -Description: - ... - -Usage: - countdown ... - -Example: - ... - - -Command: uptime -============= -Description: - ... - -Usage: - uptime ... - -Example: - ... - - -Command: weather -============= -Description: - ... - -Usage: - weather ... - -Example: DOES NOT WORK - ... - - -Command: whatis -============= -Description: - ... - -Usage: - whatis ... - -Example: DOES NOT WORK - ... - - - - ====================================== - MISCELLANEOUS/FACTOID COMMANDS - ====================================== - -Command: forget -============= -Description: - ... - -Usage: - forget ... - -Example: - ... - - -Command: {un|}lock -============= -Description: - ... - -Usage: - {un|}lock ... - -Example: - ... - - -Command: rename -============= -Description: - ... - -Usage: - rename ... - -Example: - ... - - -Command: substitution -============= -Description: - ... - -Usage: - $factoid =~ s/from/to/ - $factoid =~ s#te/st/#test#g - -Example: - ... - - -Command: karma set -============= -Description: - ... - -Usage: - $nick++ - $nick-- - -Example: - blootbot++ - infobot-- - - -Command: maths -============= -Description: - ... - -Usage: - 2 + 2 - -Example: - ... - - -Command: tell -============= -Description: - ... - -Usage: - tell about - -Example: - ... diff --git a/doc/old/notes.txt b/doc/old/notes.txt deleted file mode 100644 index 187ff71..0000000 --- a/doc/old/notes.txt +++ /dev/null @@ -1,111 +0,0 @@ -##### GLOBAL VARIABLES -### Scalar variable. -$who => Process.pl#7: -$msgType => Process.pl#7: -$message => Process.pl#7: -$origWho => Process.pl#12: untouched $who variable. -$origMessage => Process.pl#13: untouched $message variable. -$origIn => Question.pl#15: (my) successful (not repeated) asked factoid -$who => Process.pl#6: -$message => Process.pl#6: -$nuh => Irc.pl#279: nick-user-host -$userHandle => User.pl: handle which nick is registered under. -### Array. -### Hash lists. -%channels => $channels{$channel}{$mode}{$nick} -%chanstats => $chanstats{$channel}{TYPE} -%cmdstats => $cmdstats{TYPE} -%userList => $userList{$user}{$type} -%userList => $userList{$user}{'mask'}{$what} = 1; -##### - -### Thorough check and cleanup of... (comments need to be read though) -Process.pl 19991128 -Irc.pl 19991128 -Misc.pl 19991128 - - - -### Address testing with the "new" code. -### nick == $1, text = $' -blah erp good -blah erp erp good -blah:erp good... about time got it to work. -blah:erp erp good... ditto -blah :erp good -blah :erp erp good -blah : erp good -blah : erp erp good -blah : erp good -blah : erp erp good -blah : erp good -blah : erp erp good - -unfski erp good -unfski erp erp good -unfski:erp hrm... good :) -unfski:erp erp hrm... good :) -unfski :erp good -unfski :erp erp good -unfski : erp good -unfski : erp erp good -unfski : erp good -unfski : erp erp good -unfski : erp good -unfski : erp erp good - -### some notes... -&DoModes($chan,$modes,$targets); -&DeleteUserInfo($nick,@chans); -# NOTE: subhash list can only be deleted with "delete" not with "undef". -foreach $chan (keys %channels) { -foreach $mode (keys %{$channels{$chan}}) { -foreach $user (keys %{$channels{$chan}{$mode}}) { - -### &DeleteUserInfo(). -# DUI: type working fix -# part yes undef=>delete -# sign yes fe loops=>DUI($n,%c); -# nick yes undef=>delete -# kill ... ... -### - -### -### Soon to be new format of factoid.db, or at least infobot-extra.db -### -[factoid key] -> [created].[modified].[requests].[locked] - | | | | - [who by] [who by] [who by] [who by] - [time] [time] [time] [time] - [count] - -$db{'key'} = $created_by .$;. $created_time .$;$;. - $modified_by .$;. $modified_time .$;$;. - $request_by .$;. $request_time .$;. $request_count .$;$;. - $locked_by .$;. $locked_time; - -factoid can only be unlocked by creator. possibly need to be matched -against nick || user@*.x.org || user@x.y.z.* - -##### -# forget: factoid locking half-done TODO -# factoid query DONE. -# factoid update (2 create; 4 modify) DONE. -##### - -raw: ..... KICK #tnflesh damagick :i can do this too -940445681 [12632] >>> [1mtoo[0m was kicked off [1m#tnflesh damagick :i \ - can do this[0m by [1mChimmy[0m ([1mP[0m) -my ($kicker, $chan, $knick, $why) = @_; - $1 $2 $4 $5 - -("Op", yes -"Deop", yes -"Ban", yes -"Unban", yes -"Topic", yes -"Kick", yes -"PublicMsg" yes -"Part", yes -"SignOff", yes -"Join" yes diff --git a/old/Freshmeat_I.pl b/old/Freshmeat_I.pl deleted file mode 100644 index 2936b9c..0000000 --- a/old/Freshmeat_I.pl +++ /dev/null @@ -1,270 +0,0 @@ -# -# Freshmeat.pl: Frontend to www.freshmeat.net -# Author: dms -# Version: v0.7d (20000923) -# Created: 19990930 -# - -package Freshmeat; - -use strict; - -### download compressed version instead? - -my %urls = ( - 'public' => 'http://www.freshmeat.net/backend/appindex.txt', - 'private' => 'http://feed.freshmeat.net/appindex/appindex.txt', -); - -#### -# Usage: &Freshmeat($string); -sub Freshmeat { - my $sstr = lc($_[0]); - my $refresh = &::getChanConfDefault("freshmeatRefreshInterval", - "", 24) * 60 * 60; - - my $last_refresh = &::dbGet("freshmeat", "name","_","stable"); - my $renewtable = 0; - - if (defined $last_refresh) { - $renewtable++ if (time() - $last_refresh > $refresh); - } else { - $renewtable++; - } - $renewtable++ if (&::countKeys("freshmeat") < 10); - - if ($renewtable and $$ == $::bot_pid) { - &::Forker("freshmeat", sub { - &downloadIndex(); - &Freshmeat($sstr); - } ); - # both parent/fork runs here, in case the following looks weird. - return if ($$ == $::bot_pid); - } - - if (!&showPackage($sstr)) { # no exact match. - my $start_time = &::timeget(); - my %hash; - - # search by key/NAME first. - foreach (&::searchTable("freshmeat", "name","name",$sstr)) { - $hash{$_} = 1 unless exists $hash{$_}; - } - - # search by description line. - foreach (&::searchTable("freshmeat", "name","oneliner", $sstr)) { - $hash{$_} = 1 unless exists $hash{$_}; - last if (scalar keys %hash > 15); - } - - my @list = keys %hash; - # search by value, if we have enough room to do it. - if (scalar @list == 1) { - &::status("only one match found; showing full info."); - &showPackage($list[0]); - return; - } - - # show how long it took. - my $delta_time = &::timedelta($start_time); - &::status(sprintf("freshmeat: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0); - - for (@list) { - tr/A-Z/a-z/; - s/([\,\;]+)/\037$1\037/g; - } - - &::performStrictReply( &::formListReply(1, "Freshmeat ", @list) ); - } -} - -sub showPackage { - my ($pkg) = @_; - my @fm = &::dbGet("freshmeat", "name",$pkg,"*"); - - if (scalar @fm) { #1: perfect match of name. - my $retval; - $retval = "$fm[0] \002(\002$fm[11]\002)\002, "; - $retval .= "section $fm[3], "; - $retval .= "is $fm[4]. "; - $retval .= "Stable: \002$fm[1]\002, "; - $retval .= "Development: \002$fm[2]\002. "; - $retval .= $fm[5] || $fm[6]; # fallback to 'download'. - $retval .= " deb: ".$fm[8] if ($fm[8] ne ""); # 'deb'. - &::performStrictReply($retval); - return 1; - } else { - return 0; - } -} - -sub randPackage { - my @fm = &::randKey("freshmeat","*"); - - if (scalar @fm) { #1: perfect match of name. - my $retval; - $retval = "$fm[0] \002(\002$fm[11]\002)\002, "; - $retval .= "section $fm[3], "; - $retval .= "is $fm[4]. "; - $retval .= "Stable: \002$fm[1]\002, "; - $retval .= "Development: \002$fm[2]\002. "; - $retval .= $fm[5] || $fm[6]; # fallback to 'download'. - $retval .= " deb: ".$fm[8] if ($fm[8] ne ""); # 'deb'. - - return $retval; - } else { - return; - } -} - -sub downloadIndex { - my $start_time = &::timeget(); # set the start time. - my $idx = "$::param{tempDir}/fm_index.txt"; - - &::msg($::who, "Updating freshmeat index... please wait"); - - if (&::isStale($idx, 1)) { - &::status("Freshmeat: fetching data."); - foreach (keys %urls) { - my $retval = &::getURLAsFile($urls{$_}, $idx); - next if ($retval =~ /^(403|500)$/); - - &::DEBUG("FM: last! retval => '$retval'."); - last; - } - } else { - &::status("Freshmeat: local file hack."); - } - - if (! -e $idx) { - &::msg($::who, "the freshmeat butcher is closed."); - return; - } - - if ( -s $idx < 100000) { - &::DEBUG("FM: index too small?"); - unlink $idx; - &::msg($::who, "internal error?"); - return; - } - - if ($idx =~ /bz2$/) { - open(IN, "bzcat $idx |"); - } elsif ($idx =~ /gz$/) { - open(IN, "gzcat $idx |"); - } else { - open(IN, $idx); - } - - # delete the table before we redo it. - &::deleteTable("freshmeat"); - - ### lets get on with business. - # set the last refresh time. fixes multiple spawn bug. - &::dbSet("freshmeat", "name","_","stable",time()); - - my $i = 0; - while (my $line = ) { - chop $line; - $i++ if ($line eq "%%"); - last if ($i == 2); - } - - &::dbRaw("LOCK", "LOCK TABLES freshmeat WRITE"); - my @data; - my @done; - while (my $line = ) { - chop $line; - if ($line ne "%%") { - push(@data,$line); - next; - } - - if ($i % 200 == 0 and $i != 0) { - &::DEBUG("FM: unlocking and locking."); - &::dbRaw("UNLOCK", "UNLOCK TABLES"); - ### another lame hack to "prevent" errors. - select(undef, undef, undef, 0.2); - &::dbRaw("LOCK", "LOCK TABLES freshmeat WRITE"); - } - - if (grep /^\Q$data[0]\E$/, @done) { - &::DEBUG("dupe? $data[0]"); - @data = (); - next; - } - - $i++; - pop @data; - $data[1] ||= "none"; - $data[2] ||= "none"; - &::dbSetRow("freshmeat", @data); - push(@done,$data[0]); - @data = (); - } - close IN; - &::DEBUG("FM: data ".scalar(@data) ); - &::dbRaw("UNLOCK", "UNLOCK TABLES"); - - my $delta_time = &::timedelta($start_time); - &::status(sprintf("Freshmeat: %.02f sec to complete.", $delta_time)) if ($delta_time > 0); - - my $count = &::countKeys("freshmeat"); - &::status("Freshmeat: $count entries loaded."); -} - -sub freshmeatAnnounce { - my $file = "$::param{tempDir}/fm_recent.txt"; - my @old; - - ### if file exists, lets read it. - if ( -f $file) { - open(IN, $file); - while () { - chop; - push(@old,$_); - } - close IN; - } - - my @array = &::getURL("http://core.freshmeat.net/backend/recentnews.txt"); - my @now; - - while (@array) { - my($what,$date,$url) = splice(@array,0,3); - push(@now, $what); - } - - ### if file does not exist, write new. - if (! -f $file) { - open(OUT, ">$file"); - foreach (@now) { - print OUT "$_\n"; - } - close OUT; - - return; - } - - my @new; - for(my $i=0; $i$file"); - foreach (@now) { - print OUT "$_\n"; - } - close OUT; - - return "Freshmeat update: ".join(" \002::\002 ", @new); -} - -1; diff --git a/old/Freshmeat_II.pl b/old/Freshmeat_II.pl deleted file mode 100644 index 470b201..0000000 --- a/old/Freshmeat_II.pl +++ /dev/null @@ -1,359 +0,0 @@ -# -# Freshmeat.pl: Frontend to www.freshmeat.net -# Author: dms -# Version: v0.7d (20000923) -# Created: 19990930 -# - -package Freshmeat; - -use strict; -use vars qw(@cols @data $string %pkg $i $locktime); - -my %urls = ( - 'public' => 'http://www.freshmeat.net/backend/fm-projects.rdf.bz2', -# 'private' => 'http://feed.freshmeat.net/appindex/appindex.txt', -); - -#### -# Usage: &Freshmeat($string); -sub Freshmeat { - my $sstr = lc($_[0]); - my $refresh = &::getChanConfDefault("freshmeatRefreshInterval", - "", 24) * 60 * 60 * 7; - - my $last_refresh = &::dbGet("freshmeat", "latest_version", "projectname_short=".&::dbQuote('_')); - my $renewtable = 0; - - if (defined $last_refresh and $last_refresh =~ /^\d+$/) { - $renewtable++ if (time() - $last_refresh > $refresh); - } else { - $renewtable++; - } - $renewtable++ if (&::countKeys("freshmeat") < 1000); - - if ($renewtable) { - if ($$ == $::bot_pid) { - &::Forker("freshmeat", sub { - &Freshmeat($sstr) if &downloadIndex(); - } ); - # both parent/fork runs here, in case the following looks weird. - } else { - &downloadIndex(); - } - - return if ($$ == $::bot_pid); - } - - if (!&showPackage($sstr)) { # no exact match. - my $start_time = &::timeget(); - my %hash; - - # search by key/NAME first. - foreach (&::searchTable("freshmeat", "projectname_short", "projectname_short",$sstr)) { - $hash{$_} = 1 unless exists $hash{$_}; - } - - # search by description line. - foreach (&::searchTable("freshmeat", "projectname_short", "desc_short", $sstr)) { - $hash{$_} = 1 unless exists $hash{$_}; - last if (scalar keys %hash > 15); - } - - my @list = keys %hash; - # search by value, if we have enough room to do it. - if (scalar @list == 1) { - &::status("only one match found; showing full info."); - &showPackage($list[0]); - return; - } - - # show how long it took. - my $delta_time = &::timedelta($start_time); - &::status(sprintf("freshmeat: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0); - - for (@list) { - tr/A-Z/a-z/; - s/([\,\;]+)/\037$1\037/g; - } - - &::performStrictReply( &::formListReply(1, "Freshmeat ", @list) ); - } -} - -sub packageText { - my ($pkg) = @_; - my %fm = &::dbGetColNiceHash("freshmeat", "*", "projectname_short=".&::dbQuote($pkg)); - - if (scalar keys %fm) { #1: perfect match of name. - my $retval; - $retval = "$fm{'projectname_short'} \002(\002$fm{'desc_short'}\002)\002, "; - $retval .= "is $fm{'license'}. "; - $retval .= "Version: \002$fm{'latest_version'}\002, $fm{'url_homepage'}"; - return $retval; - } else { - return; - } -} - -sub showPackage { - my ($pkg) = @_; - my ($retval); - if ($retval = packageText($pkg)) { - &::performStrictReply($retval); - return 1; - } else { - return 0; - } -} - -sub randPackage { - my @fm = &::randKey("freshmeat","*"); - return &packageText($fm[0]); -} - -sub downloadIndex { - my $start_time = &::timeget(); # set the start time. - my $idx = "$::param{tempDir}/fm-projects.rdf.bz2"; - - if (!&::loadPerlModule("XML::Parser")) { - &::WARN("don't have xml::parser..."); - return 0; - } - my $p = new XML::Parser(Style => 'Objects'); - my %pkg; - my $string; - - $p->setHandlers( - Char => \&xml_text, - End => \&xml_end, - ); - - &::msg($::who, "Updating freshmeat index... please wait"); - - if (&::isStale($idx, 1)) { - &::status("Freshmeat: fetching data."); - - foreach (keys %urls) { - $urls{$_} =~ /^.*\/(.*)$/; - $idx = "$::param{tempDir}/$1"; - my $retval = &::getURLAsFile($urls{$_}, $idx); - next if ($retval =~ /^(403|500)$/); - - &::DEBUG("FM: last! retval => '$retval'."); - last; - } - } else { - &::status("Freshmeat: local file hack."); - } - - if (! -e $idx) { - &::msg($::who, "the freshmeat butcher is closed."); - return 0; - } - - if ( -s $idx < 100000) { - &::DEBUG("FM: index too small?"); - unlink $idx; - &::msg($::who, "internal error?"); - return 0; - } - - if ($idx =~ /bz2$/) { - open(IN, "bzcat $idx |"); - } elsif ($idx =~ /gz$/) { - open(IN, "gzcat $idx |"); - } else { - open(IN, $idx); - } - - # delete the table before we redo it. - &::deleteTable("freshmeat"); - - ### lets get on with business. - # set the last refresh time. fixes multiple spawn bug. - &::dbSet("freshmeat", - { "projectname_short" => "_" }, - { "latest_version" => time(), - "desc_short" => "dummy project to track date" } - ); - -# &::dbRaw("LOCK", "LOCK TABLES freshmeat WRITE"); - @cols = &::dbGetColInfo("freshmeat"); - - $locktime = time(); - - # this mess is to not dump IN to memory. - $_ = ; - $_ = ; - $_ = ; - - my $str; - while () { - chop; - - $str .= $_; - - next unless (/<\/project>/); - - # XML::Parser's parse() doesn't like the following. - # but parsefile() does... why! - for ($str) { - s/®/_/g; - s/ô//g; - s/"//g; - s/é/e/g; - s/à/a/g; - s/í/i/g; - s/­/_/g; # ??? - s/´/a/g; - s/»/_/g; # ??? - s/«/_/g; # ??? - s/©/[C]/g; - s/°/deg/g; - s/Æ/A/g; - s/\cN//g; # fucking openbsd morons. - s/ /-/g; - s/ö/o/g; - s/¶//g; # ??? - s/ã//g; - s/\cM/ /g; # stupid windows morons - s/²/square/g; - s/ü/?/g; - s/µ/u/g; - s/æ/a/g; - s/ø/o/g; - s/ð/e/g; - s/ß//g; - s/·//g; - } - - if (0 and $str =~ s/\&(\S+?);//g) { - &::DEBUG("fm: sarred $1 to ''."); - } - - $p->parse($str, ProtocolEncoding => 'ISO-8859-1'); - $str = ""; - } - close IN; - -# &::dbRaw("UNLOCK", "UNLOCK TABLES"); - - my $delta_time = &::timedelta($start_time); - &::status(sprintf("Freshmeat: %.02f sec to complete.", $delta_time)) if ($delta_time > 0); - - my $count = &::countKeys("freshmeat"); - &::status("Freshmeat: $count entries loaded."); - return 1; -} - -sub freshmeatAnnounce { - my $file = "$::param{tempDir}/fm_recent.txt"; - my @old; - - ### if file exists, lets read it. - if ( -f $file) { - open(IN, $file); - while () { - chop; - push(@old,$_); - } - close IN; - } - - my @array = &::getURL("http://core.freshmeat.net/backend/recentnews.txt"); - my @now; - - while (@array) { - my($what,$date,$url) = splice(@array,0,3); - push(@now, $what); - } - - ### if file does not exist, write new. - if (! -f $file) { - open(OUT, ">$file"); - foreach (@now) { - print OUT "$_\n"; - } - close OUT; - - return; - } - - my @new; - for(my $i=0; $i$file"); - foreach (@now) { - print OUT "$_\n"; - } - close OUT; - - return "Freshmeat update: ".join(" \002::\002 ", @new); -} - - -sub xml_text { - my ($e,$t) = @_; - return if ($t =~ /^\s*$/); - - $string = $t; -} - -sub xml_end { - my($expat,$text) = @_; - - $pkg{$text} = $string; - - if ($expat->depth == 0) { - - # old code. - if (0) { - for (my $j=0; $j 1) { - &::notice($who, "error: I dunno which channel you are referring to since you're on more than one. Try 'news #chan ...' instead"); - return; - } - - if (scalar @chans == 0) { - &::notice($who, "error: I couldn't find you on any chan. This must be a bug!"); - return; - } - - $chan = $chans[0]; - &::VERB("Guessed $who being on chan $chan",2); - $::chan = $chan; # hack for IsChanConf(). - } - - if (!defined $what or $what =~ /^\s*$/) { - &list(); - return; - } - - if ($what =~ /^add(\s+(.*))?$/i) { - &add($2); - - } elsif ($what =~ /^del(\s+(.*))?$/i) { - &del($2); - - } elsif ($what =~ /^mod(\s+(.*))?$/i) { - &mod($2); - - } elsif ($what =~ /^set(\s+(.*))?$/i) { - &set($2); - - } elsif ($what =~ /^(\d+)$/i) { - &::VERB("News: read shortcut called.",2); - &read($1); - - } elsif ($what =~ /^read(\s+(.*))?$/i) { - &read($2); - - } elsif ($what =~ /^(latest|new)(\s+(.*))?$/i) { - &latest($3 || $chan, 1); -# $::cmdstats{'News latest'}++; - - } elsif ($what =~ /^stats?$/i) { - &stats(); - - } elsif ($what =~ /^list$/i) { - &list(); - - } elsif ($what =~ /^(expire|text|desc)(\s+(.*))?$/i) { - # shortcut/link. - # nice hack. - my $cmd = $1; - my($arg1,$arg2) = split(/\s+/, $3, 2); - &set("$arg1 $cmd $arg2"); - - } elsif ($what =~ /^help(\s+(.*))?$/i) { - &::help("news $2"); - - } elsif ($what =~ /^newsflush$/i) { - &::msg($who, "newsflush called... check out the logs!"); - &::newsFlush(); - - } elsif ($what =~ /^(un)?notify$/i) { - my $state = ($1) ? 0 : 1; - - # todo: don't notify even if "news" is called. - if (!&::IsChanConf("newsNotifyAll")) { - &::DEBUG("news: chan => $chan, ::chan => $::chan."); - &::notice($who, "not available for this channel or disabled altogether."); - return; - } - - my $t = $::newsuser{$chan}{$who}; - if ($state) { # state = 1 - if (defined $t and ($t == 0 or $t == -1)) { - &::notice($who, "enabled notify."); - delete $::newsuser{$chan}{$who}; - return; - } - &::notice($who, "already enabled."); - - } else { # state = 0 - my $x = $::newsuser{$chan}{$who}; - if (defined $x and ($x == 0 or $x == -1)) { - &::notice($who, "notify already disabled"); - return; - } - $::newsuser{$chan}{$who} = -1; - &::notice($who, "notify is now disabled."); - } - - } else { - &::notice($who, "unknown command: $what"); - } -} - -sub readNews { - my $file = "$::bot_base_dir/blootbot-news.txt"; - if (! -f $file or -z $file) { - return; - } - - if (fileno NEWS) { - &::DEBUG("readNews: fileno exists, should never happen."); - return; - } - - my($item,$chan); - my($ci,$cu) = (0,0); - - open(NEWS, $file); - while () { - chop; - - # todo: allow commands. - - if (/^[\s\t]+(\S+):[\s\t]+(.*)$/) { - if (!defined $item) { - &::DEBUG("news: !defined item, never happen!"); - next; - } - - $::news{$chan}{$item}{$1} = $2; - next; - } - - # U