close Warning: Can't synchronize with repository "(default)" (Unsupported version control system "svn": Can't find an appropriate component, maybe the corresponding plugin was not enabled? ). Look in the Trac log for more information.

Changes between Version 1 and Version 2 of zomg


Ignore:
Timestamp:
Aug 9, 2010, 9:30:15 AM (14 years ago)
Author:
vsTerminus
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • zomg

    v1 v2  
    1 Placeholder.
     1= zomg = #Title
     2
     3
     4zomg is an IRC bot written by vsTerminus for the [wiki:SocialGamer] IRC network (irc.socialgamer.net:6667). Its primary function was channel moderation, but has since expanded to fill other roles as well.
     5
     6If you're curious about my development patterns, please read through the Changelog at the bottom of this file!
     7
     8''Note: This help file does not apply to a zomg bot found on any other network, as capabilities will be severely limited in one or more areas.''
     9
     10
     11== Disclaimer == #Disclaimer
     12
     13
     14This section outlines a few simple terms that you must agree to if you wish to use zomg in your channel.
     15
     16
     17*  zomg will never invite itself into the channel. The staff will never invite zomg into your channel without your permission.
     18*  Any and all admins in your channel are able to invite zomg into you channel. Invites from users who are not channel admins will not be accepted.
     19*  zomg stores a great deal of information about the users and the server. Some of this information is publicly available through a few of the commands (including !seen). The majority of this information is available to anyone by using the /whois command from any IRC client, thus cannot be considered an invasion of privacy.
     20*  Events such as changing your nick, talking, and quitting are all stored by the bot. Channel data, however, will never be given out. Example: zomg may report that you were last seen 'Talking in a channel'.
     21*  zomg prints all information it receives to its console output window. This is viewable by the author, vsTerminus, at any time. This means I, the author, am able to 'watch' your channel through the bot's window without being there myself. I will never disclose anything I have seen through this method, and primarily only use it for testing purposes.
     22*  zomg has partial logging enabled. Certain events are logged (such as all the commands used) and may be made available to other staff members if requested.
     23*  Abuse of zomg will not be tolerated. This includes knowingly attempting to cause the bot to flood itself offline, lag out, or spam excessively. Any evidence of this will be dealt with by means of a server ban. The length of which depends on the nature of the offense.
     24*  zomg is given, by default, admin access in all channels. This is done to make your life easier, as zomg requires admin to be fully functional. Server staff has complete access to zomg, and thus will have admin access in your channel through the bot.
     25
     26
     27If you do not agree to one or more of the above terms, please DO NOT invite zomg into your chat.
     28Please do not hesitate to send a PM to vsTerminus if you have any questions.
     29
     30[[TOC]]
     31
     32== Introduction == #Introduction
     33
     34
     35=== What is zomg and what can it do? === #WhatIsZomg
     36
     37*   zomg is a fully automated IRC client written in Perl. It is designed to be a public interface and extension to SocialGamer's existing services.
     38*   zomg makes managing your channel simple. Commands are built in to change modes, track users, extend the channel topic functionality, make it easier to keep unwanted people out of your channel, and much much more.
     39*   The source code for zomg is open source and available upon request.
     40
     41=== How can I get zomg in my channel? === #GetZomg
     42
     43*   It is as simple as typing a single command into your chat room. /invite zomg #yourname-chat ''(replace #yourname-chat with the name of your channel)''
     44*   Keep in mind, you must be logged in, and an administrator in the channel you are inviting zomg to. zomg will deny invites from non-admins and users who are not logged in.
     45
     46=== How can I control zomg? === #ControlZomg
     47
     48*   Controlling zomg is easy. All of the commands can be issued in one simple way. You talk to the bot in the channel like any other user, but you give it commands to do. A command is always prefixed by the public command trigger. For zomg, that trigger is !
     49*   An example of giving a command would be to type: !version
     50*   This would cause the bot to display it's internal version publicly in the channel.
     51*   You can also talk to zomg by addressing it by name rather than using the command trigger.
     52*   Example: You may type something like this: zomg, whoami
     53*   The bot would then look up some information on you and display it in the channel. This is the equivalent of typing !whoami. You may use either version for any and all commands.
     54
     55== The Big List of Commands == #ListOfCommands
     56
     57
     58The access you have to the bot at any given time is denoted by your status in the channel. When you have voice in a channel (+v, or a speaker in mibbit) you will have access to the voice commands, and everything below (the public commands). Similarly, if you are currently an op (@, or a star in mibbit) you have access to the Op commands and everything below that (Halfop, Voice, and Public).
     59
     60Certain commands (such as !up) will be based on your permanent access level in the channel, as stored by ChanServ.
     61
     62=== Public Commands === #PublicCommands
     63
     64Public commands are useable by anyone in the channel, even if they do not have voice or another status level. These commands are very limited in terms of number and functionality.
     65For all commands below, < > denotes a required parameter, [ ] denotes an optional parameter, and | denotes OR. ( ) are used to group certain items.
     66
     67 [=#cmd_version]!version::
     68 * Display the current bot version publicly
     69 * Example: !version
     70
     71 [=#cmd_help]!help::
     72 * Use this to get the latest help file available
     73 * Example: !help
     74
     75 [=#cmd_iam]!iam <description of yourself> | undefine::
     76 * This command allows you to define yourself as you see fit. Others will be able to see your description by typing 'who is <yourzomgname>' in the chat.
     77 * You can remove your definition if you so wish by passing !iam the undefine argument
     78 * Example: !iam Super awesome and totally not fat
     79 * Example: !iam undefine
     80
     81 [=#cmd_who_is]Who is <user>::
     82 * This command will look up the definition of a user, if it exists.
     83 * This command should not be confused with !whois, which is entirely different.
     84 * This command can be used with, or without a trigger.
     85 * Example: who is vsTerminus
     86 * Example: !who is vsTerminus
     87
     88 [=#cmd_who_kicked]Who kicked <user>::
     89 * This will look up the data on the last time <user> was kicked and display it publicly
     90 * This command can be used with or without a trigger
     91 * Example: who kicked me
     92 * Example: Who kicked vsTerminus
     93
     94 [=#cmd_what_is]What is <item>::
     95 * This command looks up the definition of something besides a user. If a definition exists, it will be displayed publicly
     96 * Only staff members may define items here.
     97 * Example: what is op
     98 * Example: !what is halfop
     99
     100 [=#cmd_up]!up::
     101 * This command should only be used if you have permanent access in the channel already.
     102 * It will cause the bot to look up your access with ChanServ and give you the status you are supposed to have (voice, halfop, or op)
     103 * If you do not have channel access, this command will do nothing.
     104 * !up
     105
     106=== Voice Commands === #VoiceCommands
     107These commands will require you to have voice in the channel to use.
     108Even if you have >= voice access in the channel according to chanserv, you must have voice currently to use these commands. That means if you purposely de-status yourself (Read the !down command), you will be unable to use these until you have restored your status level (Read the !up command).
     109Voice commands are generally informational and have little funcionality to them.
     110
     111 [=#cmd_down]!down::
     112 * This is much the opposite of !up. It will remove any and all status you have in the channel temporarily. Next time you join, or next time you use !up, your status will be restored.
     113 * !down
     114
     115 [=#cmd_alias]!alias::
     116 * This command will look up and display a list of all the nicknames the bot has seen you using.
     117 * Nicks are tracked based on an IP address, so if you have a Dynamic IP, the bot may tend to 'forget' who you are from time to time.
     118 * You cannot lookup the aliases of another user. If you require this, a staff member can do it, or you can look into a nick tracer script online.
     119 * !alias
     120 * !alias vsTerminus
     121
     122 [=#cmd_whois]!whois <user>::
     123 * This command will look up information about you on the server and display it publicly.
     124 * Among the displayed information is your name, hostmask, and ChanServ access.
     125 * !whois IbitePrettyHard
     126
     127 [=#cmd_whoami]!whoami::
     128 * This command is the equivalent of typing !whois <your name>
     129 * !whoami
     130
     131 [=#cmd_lastcommand]!lastcommand::
     132 * This command will display publicly the last command that was used and who issued it.
     133 * This will reflect the last '''attempted''' command, regardless of whether it succeeded.
     134 * !lastcommand
     135
     136 [=#cmd_common]!common [user]::
     137 * This command will display publicly how many channels [user] is in with the bot.
     138 * If a user is not specified, your name will be used instead.
     139 * !common
     140 * !common ChanServ
     141
     142 [=#cmd_host]!host <user>::
     143 * This command will return the host of <user> and display it publicly if it exists
     144 * !host NeGaTiVe
     145
     146 [=#cmd_seen]!seen <user>::
     147 * Seen can be used to find out when the last time the bot saw <user> was, and what they were doing.
     148 * Channel information will not be divulged, and is not logged.
     149 * !seen dho
     150
     151 [=#cmd_autobans]!autobans::
     152 * This will list all known autobans for the channel via PM
     153 * Example: !autobans
     154 * Example: !list bans (not yet implemented)
     155
     156 [=#cmd_idle]!idle <user>::
     157
     158 * This will look up the user's idle time and connection time and display it publicly
     159 * Example: !idle xsiick
     160
     161 [=#cmd_kickme]!kickme [reason]::
     162
     163 * This command will make the bot kick you. It is a Voice command because that way voiced users can kick themselves but nobody else. A harmless loophole to usual IRC kick permissions.
     164 * If you specify a reason, it will be used. If not, a default message will be used.
     165 * Example: !kickme
     166 * Example: !kickme off to bed!
     167
     168 [=#cmd_kickcount]!kickcount [user]::
     169
     170 * This command can be used to display kick information about yourself, or another user.
     171 * Four items will be displayed. Your kick total in the channel and overall, as well as how many times the bot has kicked you from the current channel, and overall.
     172 * If you do not supply a user name, your own will be used.
     173 * Example: !kickcount
     174 * Example: !kickcount vsTerminus
     175
     176 [=#cmd_peak]!peak::
     177
     178 * Peak will display some info on the current channel's peak
     179 * The channel peak is the highest recorded number of users that have been there at one time
     180 * You will also see who joined to set that record, and how long ago it was set.
     181 * Example: !peak
     182
     183 [=#cmd_listcmd]!listcmd <command | command alias | custom command>::
     184
     185 * This command allows you to see the aliases for any given command
     186 * It also allows you to see what command an alias points to
     187 * What is an alias?
     188   * An alias is just another name for an existing command.
     189   * For example, !kb is an alias of !kickban and is used the same way
     190 * This command now supports custom command info as well
     191   * Both local and global customs work.
     192 * Example: !listcmd kickban
     193
     194 [=#cmd_nowplaying]!nowplaying [user]::
     195
     196 * This command uses the data from the !lastfm command to retrieve now playing information from http://last.fm/ and display it in the channel
     197   * If you don't have an account, you can register for free and I recommend that you do!
     198 * You can look up another user or yourself if you leave the argument blank.
     199 * The user must link their name to a Last.FM account using the !lastfm command in order to see their now-playing info.
     200 * As of 0.8.1 this command uses the Last.FM API to retrieve your information. It is more accurate and reliable than screen scraping, and removes the need for pacing.
     201 * This command has 1 – 3 lines of output, and so is pace controlled.
     202   * You will only be able to use this command once every 20 seconds. I may change this value without notice.
     203 * Example: !nowplaying
     204 * Example: !nowplaying vsTerminus
     205
     206 [=#cmd_ccinfo]!ccinfo <Custom Command>::
     207
     208 * Because CustomCommand is an admin-only command, this command has been added to allow voiced users to get info on existing custom commands in the channel
     209 * This is the same thing as typing !customcommand info <custom command>, but requires less access.
     210 * Example: !ccinfo slap
     211
     212 [=#cmd_cclist]!cclist::
     213
     214 * Same idea as ccinfo, but this will list all of the existing custom commands in the channel you are in.
     215 * This is the same as typing !customcommand list, but requires less access
     216
     217 [=#cmd_gcinfo]!gcinfo <Global Custom Command>::
     218
     219 * Same as ccinfo, but applies to global custom commands
     220 * This command was added to allow regular users access to see what global custom commands exist, since that command is limited to opers
     221 * Example: !gcinfo ccinfo
     222
     223 [=#cmd_gclist]!gclist::
     224
     225 * This command will list all of the existing global commands
     226 * It was created to allow regular users to view Global Custom Commands, since that command itself is limited to opers
     227 * Example: !gclist
     228 * As a side note, it's worth mentioning that ccinfo, cclist, gclist and gcinfo are all Global Custom Commands, not hard coded commands.
     229
     230 [=#cmd_wins]!wins [user]::
     231
     232 * Display a user's current win count
     233 * Wins can only be awarded by an oper (staff member)
     234   * Asking for them is probably a bad idea
     235 * If you do not pass a name, your own will be used.
     236 * This command will look up who [user] is logged in as, that way wins transcend nick changes.
     237 * Example: !wins
     238 * Example: !wins vsTerminus
     239
     240 [=#cmd_text]!text [user]::
     241
     242 * Display information about how much [user] has been typing
     243 * Logging started for this on 30 April 2009, not in Feb like most of the other stats.
     244 * [user] is optional, if you do not specify your own nick will be used.
     245 * Example: !text
     246 * Example: !text vsTerminus
     247
     248 [=#cmd_top3]!top3 <wins|nicks|kicks|peak|lines|words|chars|commands|customs>::
     249
     250 * This will provide a top 3 list of one of several data items
     251 * nicks will give you the three users with the most aliases
     252 * kicks will be the three most kicked users
     253 * peak will be the three channels with the highest peaks
     254 * lines will give you the three users who have sent the most messages
     255 * words for the three users who have typed the most words
     256 * chars for the three users who have typed the most characters
     257 * commands will give you the three commands with the most aliases
     258 * customs will give you the three channels that have the most custom commands
     259 * Example: !top3 wins
     260 * Example: !top3 nicks
     261 * Example: !top3 kicks
     262 * Example: !top3 peak
     263 * Example: !top3 lines
     264 * Example: !top3 words
     265 * Example: !top3 chars
     266 * Example: !top3 commands
     267 * Example: !top3 customs
     268
     269 [=#cmd_uptime]!uptime::
     270
     271 * This command shows the bot's connection uptime as well as the host machine's uptime
     272 * Example: !uptime
     273
     274Who is banned
     275
     276 * This works like “who is <user>” and “who kicked <user>”, except it requires voice because of the potentially large amount of output.
     277   * A trigger is not required for this command, but may be used if you so desire.
     278 * This will read the channel's ban list, and PM you some information on each ban. This information includes
     279   * The banned hostmask
     280   * Up to three known aliases of that user if a match is found
     281   * Or the number of matches found if there are many
     282   * The time that the ban will last
     283   * The time until the ban expires
     284     * These last two will only be defined (known) if the bans were places while the bot was present. Bans places while the bot is absent are never automatically removed
     285 * This command always sends results via PM to keep spam out of the channel.
     286 * Example: who is banned
     287
     288 [=#cmd_wordoftheday]!wordoftheday::
     289
     290 * This command shows the status of the Word of the Day game
     291 * Information includes how long the current word has been un-guessed for, and who guessed the previous word.
     292 * Example: !wordoftheday
     293
     294 [=#cmd_slogan]!slogan <word or words>::
     295
     296 * This command displays a random slogan, with your word(s) inserted into it in often funny places.
     297 * Example: !slogan Dry Humping
     298 * Example: !slogan Fun
     299
     300 [=#cmd_lastfm]!lastfm <option> [args]::
     301
     302 * This command can be used to link your username to a http://www.last.fm/ account, and customize the output of the !nowplaying command.
     303 * You can look up the now-playing info of other linked users by typing !nowplaying <nick>, if they are linked. If you do not specify a nick, yours is used.
     304 * <Option> can be one of: link, unlink, currtext, lasttext, showurl
     305 * Link your account: !lastfm link <Last.FM Account>
     306 * Remove your account link: !lastfm unlink
     307 * By default, if you are currently playing a song you will see “<nick> is currently listening to <artist – title> etc”
     308   * You can change this “is currently listening to” text to anything you like.
     309   * !lastfm currtext <new text here>
     310 * By default if you are not listening to anything you will see “<nick> last listened to <artist – title> etc”
     311   * You can change this “last listened to” text to anything you like
     312   * !lastfm lasttext <new text here>
     313 * By default, the URL for your Last.FM user page is displayed when you use !nowplaying. You can change this if you don't want it showing
     314   * !lastfm showurl <yes or no>
     315 * Example: !lastfm link RageOfOrder
     316 * Example: !lastfm unlink
     317 * Example: !lastfm currtext is currently rocking out to
     318 * Example: !lastfm lasttext last rocked out to
     319 * Example: !lastfm showurl no
     320
     321 [=#cmd_fml]!fml::
     322
     323 * This looks up a random FML entry from FmyLife.com
     324 * Takes no arguments yet, might in the future
     325 * Example: !fml
     326
     327 [=#cmd_wtf]!wtf [is] <acronym>|<man page entry>::
     328
     329 * This command has a simple database of common acronyms and their meanins (eg. 'LOL' → Laugh Out Loud)
     330 * If also looks up man page entries for applications.
     331   * man pages are Manual pages for Unix based oeprating systems. If you've never used one, don't worry about this part.
     332 * For the sake of natural-ish grammar, you can optionally include the word “is” after the command.
     333 * A response of 'Nothing Appropriate' generally means “I don't know”.
     334   * Expect to see this a lot.
     335 * Example: !wtf is lol
     336 * Example: !wtf lol
     337 * Example: !wtf is ASCII
     338 * Example: !wtf blahblahblah
     339
     340 [=#cmd_weather]!weather [<Zip Code> | <City> | <Username>]::
     341
     342 * This command looks up the weather for a location using http://thefuckingweather.com
     343 * You can give it a zip code (US only)
     344 * You can give it a City (More accurate with a state or province code)
     345 * You can give it a username (More accurate if they aren't connected through a bouncer or a server)
     346 * Giving no arguments at all is equivalent to !weather <your name>
     347 * Example: !weather
     348 * Example: !weather Cleveland, OH
     349 * Example: !weather bsparks
     350 * Example: !weather 12345
     351
     352 [=#cmd_locate]!locate [<username> | <host> | <domain>]::
     353
     354 * This command can be used to look up where a specific user is located, or to find out where the server for a domain is located in the world using GeoIP
     355 * If you pass it a username it will locate where that user is connecting from. If they use a bouncer or connect through a proxy then it will only find the location of the machine they are connecting through.
     356 * You can also give it the hostmask of a user directly
     357 * This only works for North America
     358 * You can give it a doman (Such as 'google.com') and it will look up the location of (one of) the server(s) hosting that site.
     359 * Again, this only works for servers in North America. Anywhere else will not be found.
     360 * Without arguments, the bot will look up your location.
     361 * Example: !locate
     362 * Example: !locate IbitePrettyHard
     363 * Example: !locate socialgamer.net
     364
     365
     366
     367=== Halfop Commands === #HalfopCommands
     368
     369 * These commands will require Halfop in the channel to use. Halfop is denoted by a % next to your name, or a half star in Mibbit.
     370 * Halfop commands start to get interesting. They deal primarily with channel moderation, topic, and modes. The good stuff.
     371 * Again, some of these commands will have multiple aliases, or names. They will be listed in the examples.
     372
     373 [=#cmd_kick]!kick <user> [reason]::
     374
     375 * This will kick a user from the channel. Reason is optional.
     376 * Admins are un-kickable. Please keep this in mind.
     377 * <user> can also be a regex pattern
     378 * Example: !kick rockthelotus get out
     379 * Example: !k rockthelotus
     380 * Example: !boot rockthelotus
     381
     382 [=#cmd_kickban]!kickban <user> [time] [reason]::
     383
     384 * Kickban will kick the user, and IP ban them.
     385 * The bot tracks users IP addresses and so you can simply give it a name to ban, and it will automatically ban the correct IP.
     386 * If you wish, you can specify an IP to ban instead and the bot will ban that.
     387 * <user> can also be a regex pattern
     388 * [time] is specified in minutes and is optional
     389   * By default, 12 hours is used if you do not specify
     390   * You can not set a time greater than 12 hours.
     391 * Example: !kickban azuritereaction 120 Stop spamming
     392 * Example: !kb azuritereaction 5
     393 * Example: !kb azuritereaction STOP IT!
     394 * Example: !kb azuritereaction
     395
     396 [=#cmd_stfu]!stfu <user> [duration]::
     397
     398 * This command uses something called an extban, which will prevent the user from talking in the channel, but not from joining.
     399 * This does not affect voiced, halfopped or opped users at all.
     400 * This command also looks up the user's IP automatically
     401 * You can specify a time for the ban to last, in minutes, if you wish
     402 * By default, bans last 12 hours, and you cannot exceed 12 hours here either.
     403   * If you do not specify a time, the default of 12 hours will be used.
     404 * Example: !stfu POKE-JJ
     405 * Example: !stfu POKE-JJ 45
     406
     407 [=#cmd_ban]!ban <user> [time]::
     408
     409 * This command can be used to ban a user by name, or by a hostmask if you specify one.
     410 * Time is optional, and is specified in minutes.
     411 * If you do not specify a time, or specify one too large, 12 hours will be used instead.
     412 * Example: !ban POKE-JJ
     413 * Example: !ban POKE-JJ 1.5
     414
     415 [=#cmd_unban]!unban <user>::
     416
     417 * This command will unban a user.
     418 * You may pass in a user name, or an IP hostmask to unban
     419 * Example: !unban spivs1020
     420 * Example: !ub spivs1020
     421
     422 [=#cmd_unstfu]!unstfu <user>::
     423
     424 * Similar to unban, but will un-mute a user
     425 * !unstfu poke-jj
     426
     427 [=#cmd_voice]!voice <user>::
     428
     429 * Give a user in the channel temporary voice status
     430 * Example: !voice Paper
     431 * Example: !v Paper
     432
     433 [=#cmd_devoice]!devoice <user>::
     434
     435 * Remove voice from a user temporarily in the channel
     436 * Example: !devoice paper
     437 * Example: !dv paper
     438
     439 [=#cmd_topic]!topic <newtopic>::
     440
     441 * The topic is split into three parts: Topic, Status, and Static
     442 * This command sets the first part, Topic.
     443 * Example: !topic Check out my youtube videos!
     444
     445 [=#cmd_status]!status <newstatus>::
     446
     447 * The topic is split into three parts: Topic, Status and Static
     448 * This is the second part, Status
     449 * Example: !status Streaming BQP – PM me to join
     450
     451 [=#cmd_static]!static <newstatic>::
     452
     453 * The topic is split into three parts: Topic, Status and Static
     454 * This is the third part, Static
     455 * Static should ideally be used for extra information that you want to always be in your topic, no matter how often it changes.
     456 * Something like a link to your youtube, or a funny quote should go here.
     457 * Example: !static http://youtube.com/rageoforder
     458
     459 [=#cmd_mute]!mute <on|off>::
     460
     461 * Mute or unmute the channel
     462 * Mute means only users with at least voice will be able to talk
     463 * This is handy if the chat gets out of hand
     464 * Example: !mute on
     465 * Example: !mute off
     466
     467 [=#cmd_strip]!strip <on|off>::
     468
     469 * Enable or Disable color stripping
     470 * This mode allows users to send colors to the channel, but nobody else will see them.
     471 * Example: !strip on
     472 * Example: !strip off
     473
     474 [=#cmd_censor]!censor <on|off>::
     475
     476 * Enable or disable chat censoring
     477 * Example: !censor on
     478 * Example: !censor off
     479
     480=== Op commands ===
     481
     482       * These commands can only be used by channel ops, both temporary and permanent.
     483       * They involve additional modes that halfops are unable to set, as well as some extra moderation stuff that halfops are unable to do.
     484       * These commands also give you power to make the bot say stuff – Cool right?
     485
     486 [=#cmd_exempt]!exempt [user]::
     487
     488 * This will set +e on [user]'s hostmask, which exempts the user from being banned.
     489 * This does not mean a user cannot be banned, it means the server will allow the user to join even if someone sets a ban on them.
     490 * If a user is not specified, your name will be used.
     491 * Example: !exempt njo823
     492 * Example: !e
     493
     494 [=#cmd_unexempt]!unexempt [user]::
     495
     496 * This removes exempt on [user]
     497 * If a user is not specified, your name will be used.
     498 * Example: !unexempt njo823
     499 * Example: !ue
     500
     501 [=#cmd_halfop]!halfop <user>::
     502
     503 * This will give temporary halfop (%, +h) to a user in the channel
     504 * Example: !halfop toymachine
     505 * Example: !h toymachine
     506 * Example: !hop toymachine
     507
     508 [=#cmd_dehalfop]!dehalfop <user>::
     509
     510 * This will remove halfop from a user in the channel temporarily
     511 * Example: !dehalfop toymachine
     512 * Example: !dh toymachine
     513 * Example: !dehop toymachine
     514
     515 [=#cmd_op]!op <user>::
     516
     517 * This will give a user temporary Op in the channel
     518 * Example: !op Grinnz
     519 * Example: !o Grinnz
     520
     521 [=#cmd_deop]!deop <user>::
     522
     523 * This will remove Op from a user in the channel temporarily
     524 * Example: !deop Grinnz
     525 * Example: !do Grinnz
     526
     527 [=#cmd_say]!say <something>::
     528
     529 * This command makes the bot talk
     530 * Text is wrapped in [ ] to prevent abuse from underprivileged users
     531 * Example: !say hi there, I am a bot
     532
     533 [=#cmd_me]!me <something>::
     534
     535 * This command also makes the bot talk, much like !say
     536 * However, this command is the same as making the bot use /me <something>
     537 * The command “/me” on irc is generally used for actions, such as “/me enters the room, naked!”
     538 * !me uses the same syntax: “!me enters the room, naked!”
     539 * Example: !me is a bot!
     540
     541 [=#cmd_ask]!ask <user> <question>::
     542
     543 * This command will ask <user> a question.
     544 * The bot will attempt to convert your language into proper english.
     545 * You MUST use real words, spell correctly, and use proper grammar for this to work correctly.
     546 * Good Example: !ask Xyzzy if he will marry me
     547 * Bad Example: !ask someguy913 fc visions pl0x 4 me k??!
     548
     549 [=#cmd_tell]!tell <user> <statement>::
     550
     551 * This command will tell <user> your <statement>
     552 * The command will attempt to convert your text into proper english
     553 * You MUST use real words, spell correctly, and use proper grammar for this to work correctly.
     554 * Good Example: !tell Xyzzy that he is a stupid bot and needs to go die.
     555 * Bad Example: !tell someguy913 2 gtfo nub
     556
     557 [=#cmd_rr]!rr <on|off>::
     558
     559 * Choose whether users must register to chat in your channel
     560 * Useful to prevent random mibbits from talking
     561 * Example: !rr on
     562 * Example: !rr off
     563
     564 [=#cmd_nn]!nn <on|off>::
     565
     566 * Allow or disallow nick changes in your channel
     567 * This is most commonly used when the chat is muted and people decide to change nicks repeatedly to talk. Very annoying
     568 * Example: !nn on
     569 * Example: !nn off
     570
     571 [=#cmd_announce]!announce <on|off>::
     572
     573 * Announce is very different from what it was on the mIRC based zomg.
     574 * Now, it is a simple on/off switch, and rather than having the bot make your announcement, it just helps you out, so you can make it without others interrupting.
     575 * Announce on will mass de-op/halfop/voice all the users in the channel, except for you. It will then let everyone know that you have an announcement to make
     576 * When you are finished with your announcement, you can type !announce off to restore the chat
     577 * Example: !announce on
     578 * Example: !announce off
     579
     580 [=#cmd_autobans]!autobans [time <seconds>|limit <kicks>]::
     581
     582 * This will display which autobans are enabled and disabled, as well as some settings if they are enabled if no args are passed
     583 * It can also be used to specify punishment for repeat offenders who continually trip the various channel protections.
     584 * This is always on, but you can set it to any values you like (within reason)
     585 * time <seconds> lets you specify how many seconds to watch for kicks within.
     586 * Limit <kicks> allows you to specify how many times the user can be kicked by an autoban before being banned for 30 minutes.
     587 * This command will not let you set any higher than 100 kicks in 3600 seconds (1 hour).
     588   * If you do not want this to affect your channel, simply set the time to 0 seconds.
     589 * By default, this is set to 3 kicks within 5 minutes (300 seconds)
     590   * Most users will not need to change thiscus
     591 * Example: !autobans
     592 * Example: !autobans time 500
     593 * Example: !autobans limit 10
     594
     595 [=#cmd_capsban]!capsban [on|off|##|##%]::
     596
     597 * Caps ban is a form of autoban that looks for excessive caps in a users message
     598   * There are two requirements: A minimum message length and a minimum % of caps to be found in that message.
     599   * For example, if the minimum length is set to 30, messages with < 30 characters will be ignored, regardless of how many caps are used.
     600   * Similarly, the % specifies how much of the message must be in capitals to trigger a ban. 85% means that most of the message has to be capitalized, but not all. Leaving room for people who accidentally let go of Shift on the last two character
     601 * This command allows you to do a number of things regarding the excess caps autoban in your chat
     602 * The first is to display its status. Simple call it without any args
     603 * The second is to enable or disable it with on or off
     604 * The third is to set a minimum length that caps ban will require
     605 * Fourth, you can specify the minimum % threshold
     606 * Example: !capsban
     607 * Example: !capsban on
     608 * Example: !capsban off
     609 * Example: !capsban 30 <--- This sets minimum length
     610 * Example: !capsban 90% <--- This sets % threshold
     611
     612 [=#cmd_spamban]!spamban [on|off|##|r##]::
     613
     614 * Spamban is another type of autoban that is designed to catch spamming on a single line.
     615 * There are two kinds of spamming it looks for.
     616   * The first is a string of characters in a row without spaces (Such as “hsuhfihfudihuehf489hf4rF”)
     617   * The second is a string of repeated identical characters (Such as “FC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”)
     618 * Spamban has a minimum length for each of these, much like the minimum length for caps ban.
     619 * By typing !spamban 45 you would be setting the minimum length for the first type of spam ban (excess characters without a space) to 45 or greater. Messages shorter than this will be ignored.
     620 * By typing !spamban r25 you would be setting the repeated character threshold (Second type) to 25, and the user would have to type at least 25 of the same character without breaks to get kicked.
     621   * Placing the r in front of the number signifies you want to specify the number of repeated chars allowed.
     622 * Example: !spamban
     623 * Example: !spamban on
     624 * Example: !spamban off
     625 * Example: !spamban 50
     626 * Example: !spamban r20
     627
     628 [=#cmd_repeatban]!repeatban [on|off|##]::
     629
     630 * Repeatban is a third kind of autoban that looks for users who try to spam by repeating themselves over and over.
     631 * You may specify how many repeats the bot should kick at.
     632 * If a user is kicked for repeats and then comes back, only to repeat him/herself again, the bot will kick them immediately, without waiting.
     633 * This is also a global check, so if a user posts a link in three seperate channels in a row, he/she will be kicked in the last one for repeating him/herself.
     634 * By specifying a number you tell it how many bans to kick at
     635 * Specifying on or off enabled or disables the autoban, and no args shows the status
     636 * Example: !repeatban
     637 * Example: !repeatban on
     638 * Example: !repeatban off
     639 * Example: !repeatban 3
     640
     641 [=#cmd_floodban]!floodban [on|off|time <seconds>|lines <lines>]::
     642
     643 * Floodban is a limited implementation of mode +f, if you know what that is.
     644 * Basically what it does is look for <lines> messages within <seconds> seconds from any user, and kick them if they reach that limit.
     645   * This is a good way to prevent people from flooding the room with excessive pastes, or random keyboard mashing that won't be caught by the other filters
     646 * Floodban has a limit of at most 180 seconds and at most 100 lines of text. Attempting to set values above these limits will default to these limits instead.
     647   * This means, at most floodban can only look for 100 lines within 180 seconds (3 minutes).
     648 * Without an argument, the current status is shown
     649 * By default, all rooms are set to limit at 6 lines of text in 4 seconds from any user. Floodban is also disabled by default, so you will have to manually enable it if you want to use it. 6 in 4 is a good setting, I find. Most users will not have to modify these.
     650 * Example: !floodban on
     651 * Example: !floodban off
     652 * Example: !floodban time 6
     653 * Example: !floodban lines 4
     654
     655 [=#cmd_spamfilter]!spamfilter [on|off|kick|ban|list|add <expression>|del <expression>]::
     656
     657 * Spamfilter is essentially a word (or pattern) filter for text in your chat.
     658 * You can configure this command to look for certain words, phrases, or patterns using the Regular Expression (regex, google it) syntax.
     659 * Upon finding a match in a non-voiced user's text, the user can be either automatically kicked, or banned from the channel.
     660 * This is useful for such things as racist words you don't want people using, filtering out links to certain or all websites, and if you know your regex, even looking for things like excessive repeated characters, or more advanced things.
     661 * There are a number of arguments this command will accept:
     662   * on: Enable the spam filter for your channel
     663   * off: Disable the spam filter for your channel
     664   * kick: Set the automatic response to KICK a user only
     665   * ban: Set the automatic response to KICKBAN the user.
     666   * Add <regex>: Add a new filter
     667   * Del <regex>: Delete an existing filter
     668   * list: List the existing filters
     669   * No argument: Display the status of the spam filter in your channel
     670 * Here is a little intro to regex:
     671   * By default in zomg-Bot, any filter you add is case INSENSITIVE. This means that to the bot, there is no difference between banana, BANANA, baNaNa, and anything in between.
     672   * Adding a word, such as banana, to the spam filter will search for that word ANYWHERE in the user's text. They don't simply have to say banana, and nothing else
     673   * In regex, a period (.) will match ANY character
     674     * Example: the regex 'ab.d' would match abad, abbd, abcd, abdd, etc.
     675   * In regex, a* is a little different than a usual wildcard*
     676     * In this case it means “0 or more of the previous character”
     677     * So to use* in the way you are used to, you must put a period before it
     678     * .* will match any number of any characters. Anything.
     679   * ^ denotes the start of the text
     680   * $ denotes the end of the text
     681   * If you wanted to filter out anything starting with the word banana, you would use the filter: ^banana
     682   * To filter out anything ending in banana, use: banana$
     683   * To filter out someone who says banana and nothing else, use: ^banana$
     684   * The rest you will need to look up online. Regex is VERY complex.
     685 * Example: !spamfilter
     686 * Example: !spamfilter on
     687 * Example: !spamfilter off
     688 * Example: !spamfilter kick
     689 * Example: !spamfilter ban
     690 * Example: !spamfilter list
     691 * Example: !spamfilter add gay
     692 * Example: !spamfilter del gay
     693
     694 [=#cmd_nickfilter]!nickfilter [on|off|list|add <regex>|del <regex>]::
     695
     696 * This command is the same thing as spamfilter, but instead of looking for filters within text, it looks for filters within usernames
     697 * The only difference to syntax is that there is no ban or kick option here, instead a 10 second ban is used automatically.
     698 * Not passing an argument will give you the current status.
     699 * Example: !nickfilter
     700 * Example: !nickfilter list
     701 * Example: !nickfilter on
     702 * Example: !nickfilter off
     703 * Example: !nickfilter add banana
     704 * Example: !nickfilter del banana
     705
     706 [=#cmd_greet]!greet [on|off|msg|pm|public|notice|<new greet message>]::
     707
     708 * Greet is used for greet messages in your channel, that will be sent automatically to users when they join.
     709 * Without a parameter, greet will give you its current status and information.
     710 * You can turn it on and off with !greet on or !greet off
     711   * Off by default.
     712 * You can set either of three types of messages
     713   * Notice, Public Message or Private Message (PM)
     714   * Set notice with !greet notice
     715   * Set PM with !greet pm
     716     * or !greet msg
     717   * Set Public with !greet public
     718 * To set a new message, there is no special key word, just plain old !greet <new message here>
     719   * There is a message by default, so you may want to change it if you enable greetings.
     720 * Example: !greet
     721 * Example: !greet on
     722 * Example: !greet off
     723 * Example: !greet notice
     724 * Example: !greet msg
     725 * Example: !greet pm
     726 * Example: !greet Hello and welcome to my chat. The rules are: #1 there are no rules, and #2 You don't talk about fight club
     727
     728=== Admin Commands ===
     729
     730 * These commands can only be used by channel admins (&, +a) in a channel.
     731 * Please remember that admin cannot be given temporarily. It must be added using ChanServ's !add command.
     732 * Also please remember that Admins have access to everything in this section, plus all of the previous command sections, and cannot be kicked by anyone but themselves.
     733 * Admin is NOT a status symbol, please do not give it out to just anyone.
     734
     735 [=#cmd_mass]!mass <command> [args]::
     736
     737 * Mass is one of my favorite commands, it's just plain cool.
     738 * Mass will call <command> once for each user in the channel, passing in a different user each time. It's the same as you calling one command over and over on each user in the channel.
     739 * Mass will check to make sure you do have access to use the command you're trying to mass.
     740 * Keep in mind this is generally pretty spammy, please do not abuse it or it will become a restricted staff-only command
     741 * Not all commands are massable. If you try to use mass on a non-massable command you will receive an error from the bot. The useable commands should be intuitive. If not, just try them.
     742 * Example: !mass say hi
     743   * This will say “<user> hi” for every <user> in the channel
     744 * Example: !mass kick
     745   * This will kick everyone in the room. You can specify reasons here too
     746 * Example: !mass deop
     747   * This will de-op all the ops in the room.
     748 * Example: !mass seen
     749   * This will look up the last-seen info for every user in the channel.
     750
     751 [=#cmd_part]!part::
     752
     753 * This will make defiance bot leave the channel.
     754 * It will not, however, remove the channel from autojoin.
     755 * Example: !part
     756
     757 [=#cmd_leave]!leave::
     758
     759 * This will make zomg leave the channel, AND remove it from the autojoin list.
     760 * Example: !leave
     761
     762 [=#cmd_stay]!stay::
     763
     764 * This will add your channel to the autojoin list. If it already exists, you will be notified.
     765 * Example: !stay
     766
     767 [=#cmd_modelock]!modelock [<modes>|off]::
     768
     769 * This will set a modelock in your channel
     770 * A modelock is a specific mode in your channel that you may want to stay on or off permanently even if someone tries to change it.
     771 * A good example of this is the mode 'G', or Censor. If you wanted your channel to be censored all the time, you could put +G in the modelock. Likewise, if you wanted your channel to never be censored, you could put -G in the modelock.
     772 * If the bot detects someone trying to change one of the locked modes, it will reset them immediately.
     773 * You can set the modelock to 'off' to disable it.
     774 * If you do not pass in new modes, or the word off, the bot will display the current existing modelock, if there is one.
     775 * Example: !modelock -G+S
     776 * Example: !ml off
     777 * Example: !modelock
     778
     779 [=#cmd_cycle]!cycle::
     780
     781 * Cycle is used to have ChanServ reset every user in the channel to their added access level.
     782 * This means that users with temporary status (ops etc) who are not added to the channel's access list will be lowered back to whatever they are supposed to have.
     783 * Example: !cycle
     784                      #
     785
     786 [=#cmd_customcommand]!customcommand [add <name of your command> <access to use your comand> <existing command and args to call> | |del <custom command> | info <existing custom command>]::
     787 * This is really cool
     788   * Like, really cool
     789     * Like, you should really learn how to use these things. They are so cool!
     790 * Custom commands allow you to build your very own commands using any and all of zomg's existing commands.
     791 * Ever wanted a command that could, for example, kick someone with a pre-defined message so you don't have to type it out every time? CustomCommand lets you do that, and more.
     792 * There are a number of variables available to you to aid in creating your own commands as well.
     793 * The syntax is a little complicated so here's the breakdown
     794 * To add a custom command, use !cc add
     795 * The syntax for add is <Name of your custom command> <access to use your command> <Existing command and args>
     796   * Example: To add a command that simply says hello to the channel, you could use: !cc add hello voice say Hello to the channel!
     797   * This could then be used by typing: !hello
     798   * The bot would then say “Hello to the channel!”
     799 * <access> can be any status level in the channel, as well as “none” if you want anyone to be able to use it.
     800   * Accepted levels are: none, voice, halfop, op, admin, service
     801   * Service refers to the +q mode, which is only given to ChanServ. It would be silly of you to add a command that requires service, but I allow it anyways.
     802 * <Name of your custom command> can be anything you want, so long as it does not already exist as a hard-coded command.
     803   * You cannot create a custom version of 'say' for example.
     804 * <Exsting command and args> is what your custom command is going to call whenever you use it.
     805   * It should always start with a hard coded command, and be followed by the arguments you want to pass, just as if you were using it in the channel yourself!
     806 * There are some special variables that you may use when defining a custom command.
     807   * There are optional variables, and required variables
     808     * Optional variables begin with a $, and if the user leaves them blank, there is no problem.
     809     * Required variables begin with a & and if the user leaves one of these blank, the command will fail.
     810   * Here are the variables available to you for use in your custom commands: (For all variables below, you may use $ or & as you see fit, $ is used for this explanation)
     811     * $0 = The name of the command
     812     * $1 = The first word you pass to your command
     813     * $2 = The second word you pass to your command
     814       * This applies to all integers from 0 to infinity. Keep in mind it's very doubtful that there will ever be more than 100 parameters in any given message.
     815     * $1- = Everything from the first word to the end of the line
     816     * $2- = Everything from the second word to the end of the line
     817       * This applies to all integers from 0 to infinity.
     818     * $nick = Your nick
     819     * $chan = The current channel
     820     * $me = The bot's nick (Probably 'zomg')
     821     * $rnick = The nick of a random user in the channel
     822     * $rint = A random integer
     823     * $rint### = A random integer from 0 to ###.
     824       * Example: $rint500 picks a random integer from 0 to 500
     825     * $server = The server the bot is connected to
     826     * $unixtime = Unix time, aka the number of seconds since the Unix epoch (Jan 1, 1970)
     827     * $localtime = The local time (and date) of the computer the bot is running on
     828     * $noun = A random noun
     829     * $pronoun = A random pronoun
     830     * $verb = A random verb
     831     * $adverb = A random adverb
     832     * $preposition = A random preposition
     833     * $adjective = A random adjective
     834     * $clothing = A random article of clothing (The list is mostly made up of different kinds of hats right now)
     835 * If you would like to see more variables available to you, please let me know. I'm open to suggestions here.
     836 * Here are some examples of some simple commands you can make using CustomCommand:
     837   * Because there are so many things you can do, I will use a simple slap command to show you everything.
     838   * Basic slap command:
     839     * !cc add slap none me slaps &1 around a bit with a large trout
     840       * This adds a command that you can use with “!slap <user>”. The &1 is a required parameter, which will be used as the target of the slap. If the user leaves this blank (types “!slap” without anything after it) the command will not complete, and will warn the user that they did not define a required parameter.
     841     * !cc add slap none me slaps &1 around a bit with a large &2-
     842       * This adds a similar command, that you can use with “!slap <user> <object>”. The &2 requires that the object to slap with be defined by the user. Because there is a – after the 2, it will take the second argument from the user, and the rest of the words following it. This allows the user to do something like “!slap ajanata zappy gun”. If there was no – after the 2, only one word would be supported here and the rest would be ignored.
     843     * !cc add slap none me slaps &1 around a bit with a large $2-
     844       * This does exactly the same thing as the command above, but because it's a $ instead of a & on the 2, the argument is optional and can be left blank. But we don't really want this. You'd see something like “* zomg slaps ajanata around a bit with a large” unless the user remembered to define something.
     845       * For this scenario, you can actually set a default value to use if an optional argument is left undefined!
     846     * !cc add slap none me slaps &1 around a bit with a large $2-[trout]
     847       * This is exactly the same as above, but the [ ] following the variable says “If the user doesn't define something, use whatever is inside the [ ] instead”. In this case, if I typed “!slap ajanata”, I would see “* zomg slaps ajanata around a bit with a large trout”
     848       * I could also define my own object to slap with. “!slap ajanata board” would yield “* zomg slaps ajanata around a bit with a large board”
     849     * !cc add slap voice me slaps &1 around a bit with a large $2-[trout]
     850       * The difference here is the access level required to use the command. As you can see, the previous commands were set to 'none', meaning anyone could use the command. This is not always a smart idea, so this time I have limited the command to voiced users and above. That way you can control who is able to use the commands you create.
     851       * Coincidentally this allows you to do something cool: circumvent the hard coded access in some commands.
     852 *                         For example, kick requires halfop to use by default. However, you could create a custom command that uses kick but only requires VOICE to use your custom command, thus allowing voiced users access to kick others.
     853 *                         Cool right?
     854 * More custom command examples:
     855   * A !beer command to have the bot toss you (or someone else) a beer
     856     * !cc add beer voice me tosses $1[$nick] A BEER to chug.
     857       * This uses one optional argument (A username to pass the beer to)
     858       * If that argument is left blank, your nick will be used instead
     859   * A !badword command to kick someone with a preset message
     860     * !cc add badword halfop kickban &1 30s 30 Second time-out for using a bad word! $2-
     861       * This uses one required argument (the name of the user to kick) and one optional argument (Any additional info you want to add to the kick reason)
     862       * If the optional reason is left blank, the command will still run fine and look normal, so no default value is needed here
     863       * The user may not need to add anything to the kick message, so it is left optional
     864   * A !randaban command to kickban a random user for a random length of time (lol?)
     865     * !cc add randaban op kickban $rnick $rint You have been a victim of a random kickban!
     866       * This uses no input from the user, just straight “!randaban” will do it.
     867       * $rnick picks a random user in the channel
     868       * $rint picks a random number (Unless you specify, it will be between 0 and 999,999)
     869       * So this command kickbans a random user for a random amount of time
     870       * Not very practical, but kind of funny!
     871   * A command to let people voice Xyzzy, even without being ops
     872     * !cc add Xyzzy voice voice Xyzzy
     873       * This command also uses no input from the user, and circumvents a hard-coded requirement!
     874       * Normally, to voice someone you would need to be a halfop or greater. However, this command only requires voice to use.
     875       * But! This command only voices one user: Xyzzy
     876       * So you could use this command to allow voiced users in your chat to voice Xyzzy (and nobody else) when the chat is dead, without needing any of the ops to do it for them.
     877 * Please talk to vsTerminus if you do not understand anything in here. I'll be happy to explain, or update this file.
     878 * Your custom commands will only work in your channel, nowhere else.
     879 * To delete a custom command, just use
     880   * !cc del <custom command>
     881     * If the command does not exist, you'll get an error
     882     * You cannot use this to delete hard-coded commands
     883 * If you do not pass CustomCommand any args, You will be given a list of the currently existing Custom Commands in your channel
     884   * Example: !cc
     885 * If you want info on a specific custom command, you can use !cc info <command>
     886   * This will give you the name, the equivalent command that it calls, and the access required to use it
     887   * You can also get info by just passing the name of an existing command, such as !cc <command>
     888   * Example: !cc info beer
     889   * Example: !cc beer
     890 * That's it! I hope to see some awesome commands from some of you.
     891   * (And I dread to think what others will create)
     892
     893
     894
     895
     896=== Staff Commands === #StaffCommands
     897
     898The staff commands are essentially a superset of the User Commands, made up of existing user commands, overloaded user commands, and unique staff-only commands. In this section I will list any relevant information on the staff commands. If you are staff, you can use the '.' trigger to specify that you want to use the oper version of a command, if it exists. Similarly, addressing the bot by name will default to the oper version of a command if it exists. In both cases, a missing staff version of a command will just default back to the user version, so it is perfectly OK to use the . trigger for everything.
     899
     900==== Extended Functionality Commands ==== #OperExtendedCommands
     901
     902 * These commands are overloaded versions of existing commands. Typically any command that performs a check on your access, or requires a certain status will be overloaded so that staff may use them at any time with or without channel access / status.
     903 * Example of this is the kick command, which would deny you access to kick an Op unless you were an Op or an Admin yourself. The staff version of this command allows you to kick anyone at any time with or without channel access.
     904 * Sometimes these commands will allow you to specify a different channel to perform the action in so you don't have to go there yourself.
     905
     906 [=#oper_alias].alias [user]::
     907
     908 * Allows you to look up aliases of any user, rather than just yourself
     909
     910 [=#oper_add].add <user> <status>::
     911
     912 * Allows you to use ChanServ's add command without having channel access.
     913 * Useful if you have to add yourself as an op to fix a proplem, for example.
     914 * Does not check logged in as currently. You must give it a valid account name.
     915
     916 [=#oper_up].up::
     917
     918 * Just gives you +ohv regardless.
     919
     920 [=#oper_kick].kick::
     921
     922 * Removes access checks. Kick any user at any time
     923
     924 [=#oper_peak].peak [#chan]::
     925
     926 * Optionally specify a different channel to get peak info on
     927
     928 [=#oper_help].help [user]::
     929
     930 * Allows an optional user to send a help file link to.
     931 * Massable
     932
     933 [=#oper_kickban].kickban::
     934
     935 * Removes access checks, and does not print your name in the kick message
     936
     937 [=#oper_stfu].stfu::
     938
     939 * Regular version won't mute opers, this will.
     940 * Auto removes voice, halfop and op from the user
     941
     942 [=#oper_wordoftheday].wordoftheday [status|set <new word>|new]::
     943
     944 * This command can control and view the status of the Word of the Day game.
     945 * Status displays how long the word has been unguessed for
     946 * set <word> can only be done via PM to the bot, but allows an oper to set the word of the day to anything they like.
     947   * This word will NOT be placed into regular rotation.
     948 * New just randomly picks a new word.
     949
     950
     951
     952==== Oper-Only commands ==== #OperOnlyCommands
     953
     954 * These commands do not have a ! equivalent for regular users. They are primarily for controlling internal bot functions.
     955
     956 [=#oper_mode].mode <string>::
     957
     958 * A direct /mode command for when you just want to set some modes real quick.
     959
     960 [=#oper_debug].debug [on|off]::
     961
     962 * Turn debug output on or off.
     963 * Without a parameter, displays current status
     964
     965 [=#oper_echo].echo [on|off]::
     966
     967 * Turn standard output on or off
     968 * Without a parameter, displays current status
     969
     970 [=#oper_quit].quit aka .die::
     971
     972 * Quit the bot. Close the process
     973
     974 [=#oper_join].join aka .j <#chan>::
     975
     976 * Join a channel. Works via PM also
     977
     978 [=#oper_save].save::
     979
     980 * Writes the current database to a file. This is done automatically on quit anyways.
     981
     982 [=#oper_nick].nick <newnick>::
     983
     984 * Change the bot's nick
     985
     986 [=#oper_define].define <item> <description>::
     987
     988 * Allows you to add/edit items in the bot's internal dictionary.
     989
     990 [=#oper_define].define <user> <description>::
     991
     992 * Allows you to add/edit descriptions for users other than yourself.
     993
     994 [=#oper_undefine].undefine <item>::
     995
     996 * Remove the definition for an item
     997
     998 [=#oper_undefine].undefine user <user>::
     999
     1000 * Remove the definition for a user
     1001
     1002 [=#oper_stats].stats <v|verbose|users|commands|customs|nicks|defs|text|peak|kicks>::
     1003
     1004 * By default, the compressed output is used.
     1005 * V or verbose may be specified to see the multi-line, verbose output.
     1006 * Display some stats that the bot is tracking (Total/online users, kick count, etc)
     1007
     1008 [=#oper_todo].todo [newitem]::
     1009
     1010 * Keeps a to-do list for the bot
     1011 * No args displays the current list
     1012 * Note: Depreciated as of v0.8.1 as we are now using Trac for bug reports and feature requests.
     1013
     1014 [=#oper_done].done <item#>::
     1015
     1016 * Just specify the matching number beside a to-do list item to remove it.
     1017
     1018 [=#oper_addcmd].addcmd <new command> <target command>::
     1019
     1020 * This allows you to define aliases for existing commands.
     1021 * If you try to define an alias for another alias, the bot will automatically re-direct to the appropriate hard-coded command
     1022 * Support for custom args is not there, and never will be.
     1023 * The target must be a real command, and the new command cannot be an existing command.
     1024 * Example: .addcmd destroy kick
     1025   * This will let you call !destroy in the same way you call !kick
     1026
     1027 [=#oper_delcmd].delcmd <command alias>::
     1028
     1029 * This allows you to remove aliases for commands
     1030 * You cannot remove hard coded commands
     1031
     1032 [=#oper_addchan].addchan <#channel>::
     1033
     1034 * Add a channel to the autojoin list
     1035
     1036 [=#oper_whisperback].whisperback [on/off]::
     1037
     1038 * Whisperback, or quiet mode, sets zomg to whisper all command output back to the person using the command instead of displaying it publicly in the channel
     1039 * This will probably be moved to the regular user section as an Op command if I find people would use it.
     1040 * Without args, the current status will be displayed
     1041
     1042 [=#oper_timers].timers add [chan] <repeat(s)> <length> <command> [args]::
     1043
     1044 .timers del <#>
     1045 
     1046 .timers <#>
     1047 
     1048 .timers
     1049 * This command control's zomg's timer system
     1050 * Without args, all existing timers will be listed
     1051 * If passed a number, that timer will be listed
     1052   * If a timer with that ID exists
     1053   * Example: .timers 4
     1054 * Can add a timer
     1055   * .timers add [chan] <repeats> <length> <command> [args]
     1056     * [chan] is now assumed to be the current channel if you do not specify one of your own
     1057     * [chan] can also be a nick to send the output to instead of a channel.
     1058     * <repeats> is the number of times you want the timer to fire
     1059       * 0 (or less) means forever.
     1060       * Repeats are NOT saved between sessions.
     1061       * When zomg restarts, timers will continue as normal but will default to no repeats.
     1062       * You will have to re-add these.
     1063     * <length> is how long it should take the timer to fire (eg. 3600 if you want the timer to fire in one hour)
     1064       * Feeding defiance bot a negative offset is equivalent to an offset of 0
     1065     * <command> is parsed just like any other command. Any command that you can give to zomg with a trigger is acceptable here and uses the same syntax, except without a trigger.
     1066     * [args] are optional, and only needed if <command> requires them.
     1067   * Example: .timers add #IBitePrettyHard-chat 1 10 tell ibiteprettyhard that he rocks
     1068   * Example: .timers add 0 120 say The rules are: You do not talk about fight club
     1069 * Can remove a timer
     1070   * .timers del <#>
     1071   * Must be an existing number
     1072   * You can get the timer numbers by using .timers with no args
     1073
     1074 [=#oper_disable].disable [<command> [reason]]::
     1075
     1076 * Disable can be used to disable any of the regular user commands
     1077 * This does not apply to oper commands, and does not prevent opers from using commands
     1078 * Reason for disabling a command is optional but as always, it's a good idea to give one. Otherwise you end up answering a lot of questions.
     1079 * If you don't pass any args to disable, it will list all of the currently disabled commands
     1080 * A disabled command is disabled globally. This is not a per-channel thing.
     1081 * Disabled commands are Re-Enabled whenever the bot restarts
     1082
     1083 [=#oper_enable].enable <command>::
     1084
     1085 * Enable a previously disabled command
     1086
     1087 [=#oper_globalcustom].globalcustom::
     1088
     1089 * GlobalCustom uses identical syntax to CustomCommand, but applies to all channels, instead of just the current one.
     1090 * As an oper keep in mind with both CC and GC that you can give regular users access to oper commands (or certain parts of them) by pointing a custom command at an oper-only command and setting its access to something a regular user can have (admin or less).
     1091 * In the case of both an oper and a user version of a command existing, regular users will always be pointed at the user version, regardless.
     1092 * For example, the global custom command, !gcinfo points at: Globalcustom info $1
     1093   * This gives regular users the ability to use .gc info <command>, which would only be accessible by opers otherwise.
     1094   * It does not give them full access to the gc command, just to the info parameter.
     1095
     1096 [=#oper_award].award <user> <wins>::
     1097
     1098 * Use this to award a user any number of wins.
     1099 * Only supports numbers, may be positive or negative
     1100
     1101 [=#oper_restart].restart::
     1102
     1103 * Use this to restart the bot
     1104
     1105 [=#oper_addword].addword <category> <word or phrase> [ : <additional word or phrase> ]::
     1106
     1107 * Use this to add new words to a custom variable, or create a new custom variable if it does not exist yet.
     1108 * You can add multiple entries to a category with a single command, simply separate separate items with a colon (:)
     1109
     1110 [=#oper_delword].delword <category> <word or phrase>
     1111
     1112 * Use this to delete a word or phrase from a custom variable category
     1113
     1114 [=#oper_loadwords].loadwords
     1115
     1116 * This causes the bot to read and load all *.words files in its current directory and use them as custom variables.
     1117 * A file named "pokemon.words" will generate the $pokemon variable
     1118
     1119
     1120== Changelog == #Changelog
     1121
     1122
     1123In this section I will keep a log of changes I make with each version of zomg so you can see, quickly, what has changed since last time you read this file. Plus I think it's kind of cool to see how long features have been a part of the bot and how much I typically change/add in each revision.
     1124
     1125
     1126=== Version 0.8.2 – In Progress ===
     1127
     1128 * Added !weather
     1129    * Added GeoIP support to !weather
     1130 * Added !locate
     1131 * Added .addword
     1132 * Added .delword
     1133 * Added .loadwords
     1134 * Added several new custom commands to demo new functionality
     1135    * For example, !8ball and !fight
     1136 * Bot now leaves 'empty' channels and waits for a notice from ChanServ that a person has joined before coming back.
     1137    * A channel containing only the bot and ChanServ is considered 'empty'
     1138 * Using !alias and .alias will now allow you to put*!*@ in front of a hostmask, just for convenience.
     1139 * Converted documentation to Wiki format and moved to new location
     1140 * Extended the functionality of Custom Commands considerably
     1141 * Extended the functionality of Custom Variables considerably
     1142 * Fixed bug where bot would not respond to custom commands if addressed by name
     1143 * Fixed several command parsing bugs
     1144 
     1145
     1146 * Restored !wotd hint option for regular users
     1147 * Moved zomg's code into a subversion repository
     1148 *
     1149
     1150=== Version 0.8.1 – December 2nd 2009 ===
     1151
     1152 * Moved help page to static.socialgamer.net
     1153    * Updated help command to reflect this
     1154 * Updated help page formatting and style
     1155 * Bot no longer auto-rejoins when kicked by ChanServ
     1156 * Fixed !stfu length when a time was not specified
     1157 * !nowplaying now uses the Last.FM API instead of screen scraping
     1158    * Smaller output (1 line instead of 3)
     1159    * API doesn't give me the player information (yet). Sorry.
     1160 * Added more functionality to !lastfm
     1161    * You can now customize your !nowplaying output
     1162    * Syntax is different now, please read the entry for it
     1163 * !alias now accepts and removes*!*@ prefix on hostnames.
     1164
     1165=== Version 0.8.0 – October 28th 2009 ===
     1166
     1167 * Big update, long time
     1168    * With school, working on the new SocialGamer beta site, and other commitments it can be hard to find time to develop zomg further
     1169 * Changed the database serialization (storage) system
     1170    * Previously used the XML::Dumper perl module to convert all of my hash tables, important variables and other data into a convenient XML file that could be read on startup to restore information.
     1171       * XML::Dumper is Extremeley inefficient, and was causing me to use several hundred MB of RAM at run time! o_O
     1172    * Switched to YAML::XS (A perl module written in C) I can serialize the database into a single human-readable string of data and store that in a file
     1173    * RAM usage is now 1/10th of what it was previously
     1174       * I can still reduce this further with optimizations to save/load and cleaning old/invalid/unnecessary data in other areas.
     1175 * Added !fml
     1176    * May add an option to select a specific entry or grab the latest entry if there is interest
     1177 * Added !wtf
     1178    * Uses the system `wtf` command, which contains definitions for common acronyms (Like 'LOL' and 'wtf') as well as man page entries for most apps
     1179    * The wtf database is not really that extensive, and a response of 'Nothing Appropriate' means 'I don't know'
     1180 * Modified the now playing (!mp3) command to use Last.FM
     1181    * Renamed the !mp3 command to !nowplaying
     1182    * Added a hard-coded alias, !mp3 which redirects to the new command. Usage doesn't change.
     1183    * Command spans 1-3 lines of output, and so can only be used every 20 or so seconds to reduce spam.
     1184 * Added !lastfm <last.fm-account> | none
     1185 * Fixed a couple regex matches (Thanks Thierry for breaking it and Grinnz for solving it)
     1186 * Added !drums
     1187    * Wrote a search function into this command, so if you can't spell it will try to help.
     1188 * Added the ability to use the $ variables from custom commands in all commands (With the exception of $1,2,3 etc because that's just silly)
     1189 * Added some new variables for use (They work in any command, not just customs!)
     1190    * $noun, $verb, $pronoun, $adverb, $preposition, $adjective, $clothing
     1191 * Fixed default parameter parsing
     1192 * Added new words to the word of the day file
     1193
     1194
     1195=== Version 0.7.4 – September 1st 2009 ===
     1196
     1197 * Added uptime to restart message
     1198 * Added a 10 second ban to channel protections by default
     1199    * Breaks sf ban currently, will be removing that.
     1200 * Added <nick>++ or <nick>-- triggers for awarding wins to users
     1201 * Added <nick>+=, -=,*= and /= as well
     1202    * eg. toymachine++ is equivalent to .award toymachine 1
     1203    * and toymachine+=5 is equivalent to .award toymachine 5
     1204 * A word of the day system to award users with wins
     1205    * The word is selected at random, but can be set by an oper
     1206    * When the word is guessed, a new word is chosen (At random)
     1207    * A word un-guessed for 24 hours will expire next time anyone uses !wordoftheday
     1208       * Might update this to use a timer system in the future
     1209 * Tripping the spamfilter also removes 1 win now.
     1210 * Commands via PM can now be done without a trigger
     1211    * eg. /msg zomg time
     1212 * Custom Commands now support required parameters
     1213    * Variables defined with $ are optional, where as variables defined with & will be required. If a required parame