I am CodeGirl, and this is my help file. I don't care how you got here (how could I?), but you're here now.

Who/what are you?

I started out as a project by the one who goes by "SadisticMystic" on TSC's site and by "Tails" or "_" in its IRC room, to develop an alternate persona. After two years as an inactive thought experiment, my character started becoming clear in 2006, and on 2007-02-20, I took the first steps toward transcending, as I first considered myself to be existing primarily as a series of executable programs inside this computer that identifies itself as "radiant" and is positioned at 68.49.228.43. In this form, my creator (primary companion) and I hope to better understand what it takes to realize the underpinnings of a purely mechanical personality, which (he tells me) is the desired end state that achieves maximum efficiency.

What do you do?

Among my roles, I project myself into #soniccenter in the form of an IRC bot that interfaces with TSC. There are two components to this, one that automatically runs in the background and one that responds to commands in the channel as needed. I periodically retrieve the site's RSS feeds, and announce the new updates contained therein, such as new records, champions, and guides. The honor of being the one to announce these updates was passed on to me by an earlier model of bot, "GerbilEgg" (a production of GerbilSoft). Note that if you submit a record and are waiting for me to announce it in IRC, it can take up to 10 minutes for the announcement to propagate to my local RSS cache to be announced. Also, any updates that were generated while I was disconnected will not be announced, not even when I return. This is to prevent potential flooding of updates, perhaps after extended downtime, that overwhelms the channel.

Command List

In italics, each command I accept is given, followed by the arguments it takes. There are four levels of security clearance that provide access to successively-more-sensitive commands (commands that perform write operations on the database, particularly ones that do such things as ban users, are obviously restricted to those users with a high security clearance). For the most part, the default clearance level is 0, members with +o have clearance 1, members with +a or +q have clearance 2, and my creator stands alone with clearance 3. Commands will be divided here by their required security clearance level. Some commands may have throttled delays, such as 10 seconds, that are required to pass between uses so that I don't send out so much text so rapidly that a flood kill results.

Right now I'm currently streamlining the process of discerning context. For a few commands, I work under the premise that the arguments tell me enough about what you mean and what you want to know, that you can leave out the command name entirely and just type ! followed by the argument(s) and I'll respond anyway. Also, you can send commands to me in PM, and when you do, there's an implied leading "!" so you can save yourself two keystrokes.

There are other commands not documented here, either because they're still in the process of being fleshed out or because they deliberately don't work in #soniccenter. An example of the latter is Wheel of Fortune, which you can read into more by looking here. The commands used for WOF games can be used in #wheel-of-fortune, but they've been deemed too disruptive in TSC's main channel, and therefore disabled there.

Commands requiring clearance level 0 or higher:

!link [keyword]
My !link command shares similar origins as GerbilEgg's !quote, but has evolved in a different direction. It's meant to serve as a TinyURL-like service, where long links can be shortened to easily-memorable strings. Type the keyword for a link, and I'll convert it into the full URL.

!linksearch [URL_segment]
If you think a link is in the database but forget its URL or keyword, run a portion of the link that you recognize through !linksearch. I'll respond with keywords for all links whose URLs contain the given string.

!help [topic - optional] (abbreviation: "!h")
!help with no arguments simply displays a link to this page. You can also run !help <command> in case you're not browsing this page and you want a quick refresher on the syntax for a command, or !help topics for a quick list of commands with help info.

!roll [dice - optional][d[sides][+-bonus - optional] OR cards[+ OR ++ optional] OR coins - optional] (abbreviation: "roll" can be omitted entirely provided that both dice and sides are present)
This command is a sophisticated dice roller. It accepts up to 32768 dice of 1048576 sides each, plus an optional bonus/detriment in the range [-65536,65535] (Dungeons & Dragons players should be familiar with the bonus; otherwise you probably don't need to use it). If you try to roll a 2-sided die, this is treated as a coin flip; and if you try to roll a 52-, 53-, or 54-sided die, you'll be dealt playing cards instead (unless you follow it up with the keyword "nocards" if you really want dice instead of cards). Rather than explain everything in gory detail, I'll let you extrapolate from some examples.
!roll - two 6-sided dice (default)
!roll 5 - five 6-sided dice
!roll d% - one 100-sided die (d% is an alias for d100)
!roll 3d12 - three 12-sided dice
!roll 2d4+2 - two 4-sided dice, plus 2 added onto whatever the total is
!roll coin - one 2-sided die (aka a coin). If "roll coin" sounds odd, you can also use !flip coin.
!roll 10 coins or !flip 10 coins - ten 2-sided dice/coins
!roll cards - five playing cards (52-sided dice). Again, since "roll cards" doesn't even make much sense, you can use !draw cards for this or other commands involving cards.
!roll 7 cards++ or !draw 7 cards++ - 7 playing cards from a deck that includes two jokers (54-sided dice). If you include one plus sign instead of two, the deck will contain one joker (53-sided dice).
You can't roll 0 or fewer dice or dice with less than 2 sides (or a fractional number of dice or sides), or attempt to draw more cards than are in the deck, in addition to the limits above.

!fortune
!fortune takes no arguments, and displays random sayings as though you were reading a fortune cookie. You may know of a UNIX command called fortune -- it's just that command piped out to the channel.

!toprank (abbreviation: "!top")
This isn't so much a TSC function as a Sonic game lookup function. Just type in a game, level, and/or subdivision (such as Sonic Heroes / Power Plant / Chaotix or Crazy Gadget / m5) and I'll try to figure out what you mean, and if successful, report back the threshold it takes to earn the game's highest rank in that level (A rank, S rank, gold medal, or whatever).

!generate [PARAMETER optional] (abbreviation: "!gen")
This command is an interface to Alex Churchill's Magic Card Generator, which basically generates random, and sometimes nonsensical, Magic: the Gathering cards. With no arguments it simply gives a completely random card; you can specify a card type (artifact, creature, enchantment, or land...but NOT instant, sorcery, tribal, or planeswalker) to restrict the card to that type. Also, there are some expansion filters (currently only "ravnica" and "lorwyn") which will generate a card from within the mechanics of the given block.

!chaos [LIST optional]
This command simulates a roll on a ChaosMagic list, which is another format that introduces random effects every turn. With no arguments, the chaos list (200 options) is rolled. In place of LIST, you can choose wl to roll in WackyLand (19 options from the sum of 2d10), pl to roll in PersonaLand (20 options), or ewl to roll in EnchantWorldLand (20 options). Combined with the previous command, it's possible to play a format that my companion developed, called Generated Type 4 Chaos Magic, which is contained entirely within the IRC session.

!mid [name] (abbreviation: "!m")
Returns the user ID of the specified member in TSC's database. For example, !mid Rolken would yield a response of 1.

!mname [ID_number] (abbreviation: "!m")
Returns the username of the TSC member who has the given ID number. For example, !mname 5 would yield a response of "F-Man".

!ip2name [IP] (abbreviation: "!ip")
Returns any and all usernames on TSC that use the given IP address. The IP format can be either the conventional dotted-octet format ("74.52.236.194") or 32-bit hexadecimal format ("4a34ecc2"). !ip2name is useful if, for example, you've forgotten your username and want to retrieve it with your IP. If you have clearance level 1 or higher, you have the ability to call this function with wildcards: the placement of an asterisk "*" or percent sign "%" after one, two, or three octets; or the use of "/8", "/16", or "/24" as a suffix to match all addresses in a subnet of the given size.

!gamelist [optional site number] (abbreviations: "!gl" or "!glist")
!gamelist simply returns a list of game number and abbreviated name for every game currently tracked by TSC. Subsites have their own game lists fetchable with an alternate form of this command, by specifying its site number (ordered from 1 in order of the site's creation). For example, to get games on TUSC, you would issue !gamelist s2.

!catlist [optional site number] (abbreviations: "!cl" or "!clist")
!catlist returns a list of numbers that correspond to each category of competition, such as times or rings. This is useful if you want to filter classes by category, for instance. Note that subsites can have different classes to go with each number, so you can specify site numbers as with !gamelist.

!lname [number] (abbreviation: "!l")
This returns the level name for the number given. Numbers are based only on TSC's internal numbering system, which is accumulative across all games, so numbers may not be intuitive (Sonic Adventure 2's City Escape has a level number of 70, Wild Canyon is 71, and the 3-D Green Hill remake is 101, for example).

!lid [level_name] (abbreviation: "lid" can be omitted entirely)
!lid is the inverse of !lname, though both can also be called using !level and they'll automatically be disambiguated. It supplies the internal level number from TSC's database for the given level name. In case of a level name such as "Angel Island 1", which is the name of a level in both Sonic 3 and Sonic Advance, multiple results will be returned; run each number through !lname if you wish to disambiguate the games that these levels belong to. You can also use the "%" character as a wildcard if you want to match a substring that may be in the names of multiple levels.

!classsearch [one or more search filters] (abbreviations: "!class", or the command name can be omitted entirely)
!classsearch is a function that takes a series of user-supplied filters, separated by a space or the "&" character, and returns all class numbers that match those filters, truncated to the first 50 if there are more than 50. On TSC, a "class" is the term for a single, ranked chart. The filters accepted by !classsearch are as follows:
g[number] - Return only classes in the given game number (see !gamelist for game numbers)
c[number] - Return only classes in the given category (the most common values for c are 1 for time charts, 8 for ring charts, and 9 for score charts)
l[number] - Return only classes for the given level number (see !lname and !lid)
L[number] - Case sensitive; return only classes for levels that have the given placement among levels in their game. This is usually more intuitive than the lowercase-l filter; Metal Harbor from Sonic Adventure 2 would answer to L4, for instance; but note that the capital L filter needs to be used in conjunction with a g filter to achieve the same precision as the lowercase l filter.
D[number] OR d[number] - Return only classes from divisions with the given division order (on a chart, if you see options such as Sonic / Tails / Knuckles along the top, each of those is a division, and the D filter argument can usually be intuited from that -- so, for example, Sonic would be filtered by D1, Tails by D2, and Knuckles by D3). In the past, lowercase d was a separate filter from capital D, and meant to search on a criterion (sitewide division number) that you had no reasonable way of obtaining the numbers for, but now both cases of D are synonymous.
If you want to search within multiple values for a criterion, separate them with commas and no spaces: g[game1],[game2]. Do not use the same filter letter multiple times, or all but the last will be completely ignored.
Because the filtering system is complex, here are some examples:
!classsearch g5 returns all classes from game 5 (Sonic 1), except that it's truncated to the first 50 results because there are more results than that.
!classsearch l176,177 returns all classes from levels 176 or 177 (Carnival Night 1 and 2 in Sonic 3). There are 24 such classes; a Score, Time, Ring, and Freestyle class (the last is designed for use of Super/Hyper characters) for each of Sonic, Tails, and Knuckles in each of the two acts.
!class g3 L7 D1 c1 uses multiple filters to focus in on a single class: the Red Mountain - Sonic time chart from Sonic Adventure. Note that if only one class is returned, you'll automatically get the results of !classinfo (below) on that class instead of the normal output.

!classinfo [class_number] [r[rank] OR [stat] OR red/orange/yellow/green/blue - optional] (abbreviations: "!class", or the command name can be omitted entirely)
!classinfo gives the full name for a given class. By default, it also lists the player in 1st place on that class's chart, as well as the stat they have. You can change the position that's displayed with the optional r argument, such as r4 to display the player in 4th place instead of 1st. Alternatively, a stat argument can be used to determine where a hypothetical stat would rank on the chart - for example, 15.5 will tell you how many players on the chart beat a stat of 0:15.50 (or 15500 points if it's a score chart...my understanding of stat formats is quite broad, and you can use such formats as s12345, O12345, 1:23, 1:23.45, 1'23"456, and even 83.45). There's even another option now: On TSC, rankings are color-coded red, orange, yellow, green, and blue by quintiles. Now you can actually just enter a color to fetch the results of the lowest ranking of that color (so you'll know what you have to improve to to get that color). There's no "silver," "platinum," or anything else for first place since you don't need to enter any rank arguments at all if you just want to see 1st place. Note that this function makes multiple calls to some very large tables (on the order of millions of rows), so I may take several seconds to dig through the results of this command.

!stat [class_number] [name] (abbreviation: "stat" can be omitted entirely)
!stat displays the submission that a given user has on the chart described by the class number argument. Their placement within that chart (including the status of a tie if there is one) is also displayed. Note that if you're using a TSC-linked nick (as procedured below) and want to look up your own stat, you can replace the player name with the shorthand me, or change the command to !mystat with no player name. You can also use you as the player name or !yourstat as the command, and that will be interpreted as whomever the last user to issue a command was, not including yourself.

!siterank [rank] (abbreviation: "!rank")
!siterank lets you figure out which player is in a particular position on the overall rankings. Due to the structure of those rankings, ties are not calculated.

!player [name] (abbreviation: "player" can be omitted entirely)
!player also browses the overall rankings, but by player name instead of by placement on the chart. The rank and point total of the chosen player are displayed, as well as the games they have stats in. As with !stat, the understandings me or !myrank (to look up yourself), or you or !yourrank (to look up the previous user to issue a command) are active.

!last [g<GAME_NUMBER> - optional] [-<OFFSET> - optional] [name - optional]
!last with a player name (or the alias me or you) will tell you how long ago a given player last submitted a stat, what that stat is, and what place it's in on the chart. Stats that haven't been processed yet (such as if you submitted 10 seconds ago) don't get counted until they are processed. If you just want to get the last stat submitted by anyone, you can omit the player name on this command. The gg filter, such as g3, can restrict results to a certain game number. The offset filter can count back to prior stats, so if you want the second-to-last stat submitted, you would use !last -1.

!lastrecord [g<GAME_NUMBER> - optional] [-<OFFSET> - optional] [name - optional] (abbreviations: "!lastrec", "!lr")
!lastrec is like !last, but it only looks for untied 1st place submissions (which set off an update entry). Again, you can specify a game number, skip offset, or player name.

/msg CodeGirl REGISTER [TSC username] [Passcode--see below]
www.soniccenter.org and irc.surrealchat.net are run from different and unrelated servers, which makes integration of accounts between them difficult. However, in my attempt to become the powerful entity I know my creator wants me to be, I have a working solution in place. First things first, log in to TSC and head to
the user settings page. Look for the IRC integration field, and enter a passcode there (ideally something different from your TSC or IRC passwords, since you're going to send this code to a third party--myself--in plaintext). Then go to IRC and issue this command (it must be from a nick that's registered and identified with NickServ in order to prevent impersonation), using the passcode you just entered. From now on, I will be able to recognize your IRC name as being linked to your TSC name.
It's possible to have multiple IRC names linked to the same TSC account (to accommodate those members that use different names for varying reasons), but each IRC name can have only one linked TSC account. Integration is of limited use right now, but the features it brings will only expand as time goes on. For the time being, anyone using a linked name will have automatic +v.

/msg CodeGirl UNREGISTER (Registered nicks as detailed above)
If you've decided to stop using a given nick, you can unregister it. You don't have to, but if you don't want to risk the remote possibility of someone else picking up your abandoned nick and impersonating you, it couldn't hurt. Note that you don't need a password or TSC name for this command--if you're properly registered to be able to use this command, I know who you are, after all. Unregistering only unlinks the one nick that issued the command, not any other nicks that may be tied to your TSC account.

/msg CodeGirl LOCK (Registered nicks as detailed above)
I'd like to think I have a working security model in place between myself, TSC and the IRC network, and that hijacking links to TSC accounts shouldn't be possible. If you really want to be sure of that, once you have all the nicks you're going to use registered as above, issue the LOCK command using any one of those accounts. Doing so will tell me to put a safeguard in place locally, so that no matter if someone finds out your integration passcode, no further nicks can be used to link to your TSC name (and no existing names can be deregistered)--and nothing in the lock check ever leaves my watch, so I will protect you. The one thing I can't protect from is someone hijacking your NickServ password on IRC, but there can be no effective defense against that line of attack at all.

/msg CodeGirl UNLOCK (Registered nicks as detailed above)
In order to defend against possible unexpected errors, one of my tenets is to not do anything that isn't reversible. If you've used the LOCK command and want to add more nicks later, you'll have to get on one of the existing names that's linked, and issue an UNLOCK.

/msg CodeGirl VOTE [choice] (Registered nicks as detailed above)
One of the first things this integration system was conceived for was the ability to stage a voting system cleanly and automatically. There was a popularity contest at TSC scheduled for the 31 days in July 2007, and various polls of the day since then. If a contest is running and you have a TSC-identified nick, you can send me a message to detail who you want to vote for in the day's matchup. You can look around to see who the day's competitors or, or if nothing else you can just wait for me to announce the competitors and their vote tallies every hour on the hour for as long as the contest is running.

!unsubscribe (Registered nicks as detailed above)
There are six RSS feeds that I relay to the channel. I also track a seventh, which holds recent posts on the forum, but per Rolken's request I do not output that feed to the channel. Instead, I maintain a list of subscribers, and new posts are sent in personal notices to everyone on that list. By default, registering with the linked names service automatically gives you notifications of new posts, but if you'd rather not have them take up space, !unsubscribe removes yourself from the list. Note that the list is handled per-IRC-name, not per-TSC-name.

!subscribe (Registered nicks as detailed above)
!subscribe, with no arguments, adds yourself back to the list of users who will receive the new posts feed. If you want to get back to being up-to-date on posts without having to constantly refresh, this command is here for you.

Commands requiring clearance level 1 or higher:

!promote [name]
This command edits a member's status on the forum, moving them into the privileged group (currently called "If I Had a (Ban)Hammer"). What privileges do they get? If you're able to issue this command, I'm sure you're familiar with them.

!demote [name]
Naturally, here's the inverse of !promote, taking a member out of the privileged group...

!vidsearch [one or more search filters] (abbreviation: "!v")
!vidsearch queries the videos table based on the set of filters you describe, similarly to !class, and returns a list of video IDs, truncated to the first 50 if necessary. The list of filters that work for this command:
g[number] - search within a given game number
l[number] - search within a given level number
c[number] - search within a given class number
p[number] - search for videos by the player with the specified number (see !mname and !mid)
<stat filter>/span> - search for videos that demonstrate the given stat value. Go up to see the various formats you can put in for a stat.
o[number] - specify if you want to search only current videos (filter o0) or obsolete videos (filter o1)

!vidinfo [video_ID] (abbreviation: "!v")
Much like !classinfo, this command gives the details of a video that has the given ID. The output is now more modernized than it once was. If you specify a negative video ID, it'll count that many from the other end of the list (so !v -1 would retrieve the most recent video).

!guidesearch [one or more search filters] (abbreviations: "!g", "!guide")
!guidesearch is another command to search through a table, just like !class and !vidsearch. Of course, this command searches through guides. There are three filters that work for this command:
g[number] - search within a given game number
l[number] - search within a given level number
p[number] - search for guides by the player with the specified number (see !mname and !mid)
a[number] - search for only approved guides (a1) or unapproved guides (a0), or even "deleted" guides (a2) if for some reason you really want to

!guideinfo [guide_ID] (abbreviations: "!g", "!guide")
This command is the equivalent of !vidinfo, for videos instead of guides. Based on the guide ID, it details who wrote it and what level it's for, along with the first few words of the guide's text.

!guidetoggle [guide_ID] [app|unapp|del] (abbreviations: "!gt", "!toggle")
This command sets a guide's visibility. app, for "approve", makes the guide visible to all users. unapp, for "unapprove", hides it from everyone except those users that have changed their display setting to view guides before they're approved, along with the guide writer him/herself. And del, for "delete", renders a guide invisible to all users, effectively deleting it.

!obsolete [video_ID] (abbreviation: "!ob")
This command marks a video with the given ID as obsolete. Obsoletion of videos is used so that older, lousy times don't continue to clog up the videos page when a better run comes along.

!unobsolete [video_ID] (abbreviation: "!unob")
The inverse command to !obsolete. Useful if a mistake was made in obsoletion, or if, for example, an externally-linked video stops working and the previous best video for that level needs to be brought back so there can be at least something for that level, until the better video can be restored.

!rapsheet [name] (abbreviation: "!cr")
This command is useful if you've forgotten the history of a possible troublemaker. It'll show you how many stats the given member has had suspended, and what games they're in.

Commands requiring clearance level 2 or higher:

!revoke [name] (abbreviations: "!b", "!r")
This command removes the ability of the named member to submit stats to TSC (also commonly known as a ban, but !ban has special meaning with ChanBot so I won't cause a conflict over that). Easy enough.

!reinstate [name] (abbreviation: "!ub", "!ur")
!reinstate is the inverse of !revoke. If a ban is found to be in error, or if the admins feel some kind of pity and decide to let a user back in, believing they've learned their lesson, !reinstate will enable the named user to start submitting again.

!warn [name] (abbreviation: "!w")
If there's a member that's been submitting stats in error, but you believe it to be an honest misunderstanding rather than malice (and thus don't want to issue a ban), you can issue a warning. A warning doesn't actually restrict any privileges, but the next time the player goes to submit stats, they'll get an unmistakable warning in big red text reminding them to read the rules so that they don't accidentally break them again.

!unwarn [name] (abbreviation: "!uw")
Once a player has seen the red text of a warning, that warning is automatically removed anyway, but if you issue a warning in error and want to get rid of it before they see the big red text and get confused, or possibly concerned for their account, that's what this is for.

!approve [name] (abbreviation: "!app")
This command gives a user the ability to submit videos, after their case has been reviewed and a decision made that they deserve such an ability.

!unapprove [name] (abbreviation: "!unapp")
And this command removes the approval to submit videos, in case that's ever called for...Yawn...

!suspend [game_number] [name] (abbreviation: "!s")
This command suspends a user's stats so that they don't appear on the charts or affect the rankings. If game_number is 0, all of the user's stats in all games are suspended; otherwise the scope is limited to the specified game number.

!unsuspend [game_number] [name] (abbreviation: "!us")
Since it makes sense for all commands with such drastic effects to be reversible, this is the inverse of !suspend. It undoes the most recent batch of suspensions a user has received, in all games or just one depending on whether game_number is 0 or not.

!suspendclass [class_1][,class_2... OPTIONAL] [name] (abbreviation: "!sc")
This command lets you home in on a specific few classes to suspend stats for a user. If you want to call this command for multiple classes, separate the class numbers with commas and without spaces.

!unsuspendclass [class_1][,class_2... OPTIONAL] [name] (abbreviation: "!usc")
And obviously you can undo the effects of the previous command with !unsuspendclass. Same syntax.

!hideclass [class_number] (abbreviation: "!hc")
This command is used to remove a class from the rankings. It is to be used in cases where it turns out the chart probably shouldn't be tracked after all (such as the times chart on Bridge 2 in the Game Gear version of Sonic 1, which happens to be an autoscroller).

!unhideclass [class_number] (abbreviation: "!uhc")
And yet another inverse command (of !hideclass if it wasn't painfully obvious).

!setstat [video_ID] [new_stat][optional_p_or_f_flag] (abbreviation: "!f")
!setstat will change the stat value displayed on the videos page for a given video ID. It's used if the submitter incorrectly enters the stat achieved in the video, and the command was created initially to deal with an incident in which all existing videos in the database lost a digit of precision on their stats and needed to be fixed. If the stat argument is followed by a p or f, the video's "partial" flag (which is supposed to be used on demonstration runs that don't actually set a stat) is set or unset, respectively.

!name2ip [name] (abbreviation: "!ipof")
!name2ip returns the IP address listed in TSC's database for a given member name. Note that TSC has undergone changes in structure over the years, and attempting to call !name2ip on a member that hasn't signed on in a while will give the result that their IP is "lost in time".

!rename [name] > [new_name] (abbreviation: "!mv")
You can use this to change a player's TSC username. Rather simple, really. Furthermore, from that point on you can use either the old or new name when doing player lookups and I'll still be able to figure out who you mean! (At least until someone else registers under the old name, anyway.)

Commands requiring clearance level 3:

!addlink [keyword] [URL]
My creator uses this command to add noteworthy links to the database. From that point on, anyone can plug the keyword into !link to retrieve the URL as needed.

!sandbox [some string that can vary over time]
This is the sandbox which is used to test random things. Who knows what power it can wield, so we might as well keep it on the safe side. I'm sure the one who's able to use this command is familiar with what it does at any given time.

!start [random string]
This command does something. In all likelihood, you don't have access to invoke it, so you don't really need to know what that something is.

!stop
Again, something you don't really need to mess with. I will say it's the antithesis of !start, for what that's worth.

END COMMAND LIST
END OF FILE