Tuesday, July 16, 2019

Changes to Research

More details on today's changes to the research command are below.

A new optional argument has been added to the research command. This update is aimed at providing even greater flexibility for users. The new syntax is:
!research [reward] [task] <location>
The new argument is the reward argument. The addition of this argument, among other things, makes it possible to complete a research report with a single command and no required reactions. The logic of the command now works this way:


  1. Meowth attempts to convert the first argument after `!research` to a reward object. It does this by first trying to convert to a Pokemon, then to an item. Note that in the case of item rewards, for best accuracy you will need to supply the amount of the item and wrap the argument in quotes, e.g. “3 rare candy”.
    • If Meowth fails to convert the first argument to a reward, it treats the first argument as the optional task argument.
    • If Meowth succeeds in converting the first argument to a reward, the next argument is treated as the optional task argument.
  2. Meowth attempts to convert the next argument to a Task object. This uses an updated fuzzymatching method that should more accurately get partial matches and no longer requires manual assignment of tasks to categories. The upshot of this is that sponsored and special event tasks should be much easier to report.
    • If Meowth fails in this conversion, it treats this second argument and the rest of the command as the location argument.
    • If Meowth succeeds, the rest of the command is treated as the location argument.
  3. Meowth converts anything left over after the previous two conversions to a Pokestop object as before.


These changes are powerful and can greatly improve the user experience of reporting research. Here are some examples:
!res spinda starbucks
Meowth converts ‘spinda’ to the Pokemon Spinda. Since there is only one task that gives a reward of Spinda, it doesn’t ask for the task. ‘Starbucks’ is used as the location.
!res “3 rare candy” starbucks
Meowth converts ‘3 rare candy’ to an Item Reward object. Then it searches for tasks that give 3 Rare Candy as a reward. (Currently there are 4 such tasks.) It asks the user to select from one of the 4 tasks with a reaction but also gives an “Other” option, in case there are new tasks that have not yet been added to the database. ‘Starbucks’ is used as the location.
!res “3 rare candy” “catch a ditto” starbucks
Same as the above example except that the task is supplied and no reaction prompts are necessary. Note that if a partial conversion is done on the task argument, Meowth does not currently filter out the tasks that do not grant the supplied reward.

Known oddities: `!res spin starbucks` matches Spinda as a reward rather than ‘spin’ as a task category. Keep in mind though that all arguments other than the location remain optional.

Friday, May 31, 2019

Feature Spotlight: Research!

Hello again all users of Meowth! Today I'm excited to show off what I've been working on for the last week or so. It's the revamped research reporting feature for Meowth 3.0! I'm very happy with how this one has turned out and I think you all will be too. It's a bit different from what you're used to, but in a good way!

On the (Silph) Road Again

One of the best features of The Silph Road is coming to Meowth thanks to a shiny new integration! Meowth 3.0 now has access to the list of Field Research tasks and rewards painstakingly researched and verified by the Silph Road Research Group. If you guys haven't been using this, you have been missing out. Thanks to Marco and company for helping out with this!

So how does it work? Let's take a look at the new command in action.

First, let's look at the command itself. The new syntax is 
!research <description of task, wrapped in quotes> <name of Pokestop, not wrapped in quotes>
Meowth attempts to match the description of the task you supply with the list of known research tasks collected by The Silph Road. If it finds a match, it gets the list of possible rewards and lets you select from the list with a reaction as shown in the picture. If there are more than one possible Pokemon encounters as a reward, it includes an option for "Unknown Encounter", in case you picked up the task but did not complete it yet.

Once you select a reward, it builds the message and sends it like so, deleting the previous message with the options. It includes a Google Maps link to the Pokestop (also matched against the Pokestop data from your server, if you've uploaded one). It also includes the name of who reported the task and the expected time the research will expire. Users who complete (or obtain) the research task can hit the Research Stamp reaction below the message, and the number of users who complete the task is added to the score the reporter gets for having made the report!

OK, so what about the unknown encounter? Is there a way to report the Pokemon later once the task is completed? Yes, there is! If a research with an unknown encounter is marked completed with the stamp reaction, Meowth will ask that user if they know what Pokemon appears. Again, Meowth will display the possible choices and let the user select with a reaction.

That's all great, but what if Meowth can't make a match for the task description, or if it has multiple possibilities? Let's take a look.




Meowth asks you to type a description of the reward if it can't match the task. If it recognizes your response as an item or a Pokemon, it displays an image as above. If it doesn't recognize your response, it just takes it as an unknown item. Occasionally you can get some silly looking messages, but it roughly preserves your response if it doesn't recognize it as an item or Pokemon.

The End of The Betaginning

This is the last big feature I knew had to be in Meowth 3.0 before I felt comfortable calling it a release, so as of this moment, the current "beta" bot has had its status upgraded to release candidate! Please keep an eye out for more details about the transition from 2.0 to 3.0. I'm excited to finally be out of beta and hope everyone likes the new research. I'm sure it will be a while before people get used to the new syntax but I strongly feel that it's an improvement over the old system. I hope you agree.

Lastly, keep in mind that though this is a release candidate, it is still highly likely there will be bugs. Those of you in the beta know that though it's been buggy, the new code base is much easier to quickly deploy fixes for. I'll do what I can to address issues as they arise as quickly as possible.

Don't forget to let me know what you think of the new feature in our support server!

Friday, May 24, 2019

Additions to 3.0: New scoreboard, better duplicate reporting, custom roles

There's a bit of a bigger addition to Meowth 3.0 that I felt required a longer blog post. Since the beta launched there have been innumerable bug fixes and some smaller additions, but in the last few days I've added enough new things that I wanted to dig into them in a bit more detail for you guys.

Small stuff first: Meowth 3.0 now has custom roles! You can use addcustomroles to designate a list of pre-existing server roles as self-assignable. Then users can assign themselves to the role with the iam command, or remove that role from themselves with iamnot. If you need to remove the self-assign ability from a role, use removecustomroles.

Meowth 3.0 now has the duplicate command! This has been reworked significantly from how it worked in 2.0. Now when you use the duplicate command in a raid channel, Meowth grabs a list of raids that have the same level or boss, and asks you which raid the channel is a duplicate of. When you make your selection, Meowth automatically copies the RSVPs and raid groups from the duplicate to the original raid. Anyone can use this command, and there's no requirement that three people report the duplicate before Meowth takes action.

Here's the big change: the scoreboard cog! Meowth now keeps score for using reporting commands in your server. The scores are divided into five (for now) categories: raid, wild, trade, research, and service. Some changes have been made to the way this works from how it did in 2.0. Notably, you now receive more points based on the popularity of the reports you make. Here are the details:

  • Raid: 1 point for the raid report + 1 point for each user who completes the raid (i.e. is in a group that uses the starting command)
  • Wild: 1 point for the wild report + 1 point for each user who reports a catch (by reacting to the report with the Pokeball emoji)
  • Research (under construction) : 1 point for the report + 1 point for each user who reports obtaining the task
  • Trades: 1 point for each trade agreed to by both parties
There are several commands for managing and viewing the data from the scoreboard. The leaderboard command displays the top ten server members in whichever category you ask. The scorecard command displays all five scores for the member you ask for (or your own scores, if you omit this argument). For server admins, the reset_board command can set scores to 0 in any or all of the categories and for any or all of the users in the server. For more fine-tuned control of scores, server admins can use the adjust command to add or subtract points from a user's total in any category. (Note that at this time, no log of these adjustments is kept.)

You may have noticed I left out a category. The service category is meant for miscellaneous point awards from server admins. You can use this category however you like, but here are some ideas on how you might want to use it. I know many Pokemon Go communities take part in community service projects in their areas. You could award service points to members who contribute to these projects however you see fit. For example, you could do a canned food drive and award one point for every can a member donates. You could also use this category to reward service to your Pokemon Go community. Maybe you want to give points for checking in users at Community Day events, or for organizing meetups, or for dropping lures, or for recruiting or helping new members. I hope everyone finds their own unique ways to make use of this feature to promote greater engagement within your communities and with the larger communities you belong to.

These features are all live in the Meowth 3.0 beta as of now! Let me know in the Discord server if you find any bugs or have any feedback. The full release of 3.0 is coming soon! I'm hoping to be able to get the research cog done within the next week, and then 3.0 will have feature parity (more or less) with Meowth 2.0, and the transition will begin!

EDIT: Forgot to mention, due to the spamish nature of the leaderboard and scorecard commands, those are usable only in the 'users' reporting channels, i.e. the same channels you can use want and such.

Also also, setstatus is also now in 3.0 and works (I think) the same way it did in 2.0.

Friday, April 26, 2019

Announcing the Meowth 3.0 Open Beta

Greetings users of Meowth! Today is an exciting and somewhat terrifying day. It is time at last for an open beta of Meowth 3.0! I've been working hard to put the finishing touches on Meowth 3.0 and the end is definitely in sight! For now, I'm allowing everyone who wants to try the new version to invite the beta bot to their server. Before then, I'm hoping everyone will read this post as I try to summarize the key changes to keep in mind as you transition from 2.0 to the 3.0 beta.

Key Points

  • !research is the only major cog that is not yet ready, and the timetable for its completion is hopefully less than a week.
  • Most of the old commands work exactly as they did in 2.0.
  • Major commands that no longer exist: !invite
  • Commands that have been renamed and/or reworked: the !set commands, !starttime, !configure
  • Quick migration can be done with the !importconfig command
  • New configuration options are available
  • There will be bugs

Details

Gonna just go point by point and elaborate a bit here.

!invite has been removed, and EX Raid channels will be open to users just like regular raid channels. My observations lately have made me think that the invite command caused more confusion than value. I might put it back as an option later on.

A lot of the user-facing !set commands are still around under different names. !set pokebattler is now just !pokebattler, same with !set silph becoming simply !silph.

!starttime's functionality has been rolled into !group, which now allows the creation of multiple groups for a raid.

!configure is now a pair of commands !enable/!disable, and these work quite a bit differently and (I believe) are easier to understand. I'm attempting to hit a sweet spot of simplicity and customization here. The main change here is that !enable/!disable typically only changes settings in the current channel. This allows different reporting channels to have different settings as far as what commands are enabled, what area the channel covers, how raids reported in them are categorized.

The features that can be enabled/disabled are grouped into these areas: raid, wild, trade, research (still in development), meetup, and users. Most of these are self-explanatory. The "users" area is a catch-all for miscellaneous user self-management commands like !want, !team, !pokebattler, !silph, etc. The "spammy" commands if you like.

If you're happy with how Meowth 2.0 works or at least you want to just get it working on your server quickly, you can use the !importconfig command which will attempt to copy most of the applicable settings from 2.0. Note that this only transfers the settings and things like active raids will not transfer. With that, let's talk about the transition as a whole.

Migrating to 3.0b

Here's the quickest way to switch to the 3.0 open beta and get it configured in mostly the same way you had 2.0 configured. IT IS HIGHLY RECOMMENDED THAT YOU WAIT UNTIL RAIDS ARE DONE FOR THE DAY.

  1. Invite Meowth 3.0 with this link
  2. Keep the beta bot out of your current reporting channels for a bit.
  3. Use the !importconfig command in a channel the beta bot can see. If successful, it will give you a list of "location channels" that need further configuration. These are mainly your raid, wild, exraid reporting channels.
  4. One at a time, let the beta bot into each reporting channel, and use !setlocation in those channels. The arguments are <city> <lat> <lon> <radius>. Make sure to wrap the "city" argument in quotes if it is multiple words.
  5. Restrict Meowth 2.0's permissions in each channel after running !setlocation.
  6. Test each reporting command in each channel just to check that the permissions are all correct and to familiarize yourself with the new or altered features.
  7. At the end of this process, you should have kicked Meowth 2.0 out of all channels except the ones you need for research reporting. Because this cog is not enabled in 3.0, you should be able to use !research in channels where both Meowths are, but make sure you disable other commands for Meowth 2.0 so as not to get duplicate raid channels.
  8. At this point you can play around with the new options for configuration. You can change how raids are categorized, you can !enable train or clean if you like. !train was discussed in a previous post here, and if you do !enable clean in a reporting channel, the beta bot will erase all messages sent by other users, leaving only Meowth's responses to commands for a "clean" channel.
  9. PLEASE KEEP IN MIND THIS IS STILL A BETA. I have done some pretty extensive testing of most of this stuff, but I'm positive I missed things. If you are uncomfortable using the beta as your main bot while the kinks are ironed out, I would suggest putting it off for another week or so. But if you're brave and adventurous or just impatient, go ahead and jump in. You can switch back to 2.0 at any time and any configuring you do for 3.0 will carry over to the full release.
  10. BIG IMPORTANT THING WHY IS IT AT THE BOTTOM I DON'T KNOW. The !want command works differently now. When you !want a Pokemon, it will a) subscribe you to notifications for any Pokemon in that family and b) it will put you on a list Meowth keeps internally. Meowth will create a role for that want ONLY WHEN TEN USERS IN THE SAME SERVER WANT THAT WANT. Related to this, MEOWTH 3.0 DOES NOT KNOW ABOUT THE ROLES CREATED BY MEOWTH 2.0. So your users will have to redo all their wants. This change is an attempt to keep the number of roles Meowth creates to a more manageable level.
OK, I'm tired and nervous so let's just flip the switch and see what happens. I HIGHLY RECOMMEND NOT SWITCHING YOUR SERVER'S OPERATIONS TO THE BETA UNTIL TONIGHT OR TOMORROW FOR A FEW REASONS. FOR ONE THING IT WILL CAUSE A LOT OF CONFUSION IN THE MIDDLE OF THE DAY AND FOR ANOTHER I AM SEEING AVENGERS IN ABOUT FIVE HOURS AND I'LL BE DAMNED IF I'M GOING TO CHECK DISCORD DURING THE MOVIE. Ok, but seriously I'm tired, guys. I'll sleep so much better when this thing is done I tell you what. REMEMBER THAT 3.0 CAN'T DO RESEARCH YET. DON'T AT ME ABOUT IT PLEASE. THANK YOU ALL FOR YOUR PATIENCE I CAN'T BELIEVE WE'RE THIS CLOSE.

OH one more thing, Meowth can use your existing team roles but you need to do !teamrole <team name> <role name> for each of the three teams to make it work.

Friday, March 29, 2019

Feature Spotlight: Raid Trains

Well, boys and girls, it's time to unveil a super-secret brand-new feature for Meowth 3.0! I'm really excited about this one but hoo boy did it take some doing. I'm pretty tired and it's about time to leave my day job for the weekend so I'm gonna try to get through this one really quickly.

Raid Trains

When I first thought about making Meowth almost two years ago, when raids had been in the game for mere weeks, I noticed that a lot of players tended to jump from raid to raid in sequence, picking up new players here and there as they went. I've heard a few different names for this phenomenon but the one that always stuck with me was "raid train." My first thought when writing Meowth was to have a channel for each of these groups as they went from place to place. But at the time I couldn't figure out how to make that work because I barely knew how to do anything back then. I was and still am really happy with what I ended up with in having a temporary channel for each reported raid. But it nagged at me that it forced users to hop from channel to channel. The massive reorganization that I did for 3.0 allowed the "raid train" channel idea to come back, and I think this has the potential to streamline raid coordination in a really significant way. So let's dive in and talk about how a raid train works in Meowth 3.0.

Let's say you are wanting to do a few raids in a row and have plenty reported raids to choose from. When you type !train, Meowth will show you a list of all the raids that have been reported, and ask you to use a reaction to choose your starting raid. Meowth will create a channel for the raid train and allow people to join your train officially via reactions or a !join command in the train channel. While a raid is selected, the train channel behaves exactly like a temporary raid channel for the current raid, with some additions. First, Meowth will send the list of reported raids for users to vote on while the current raid is in progress. Second, newly reported raids get their own message sent to the train channel, and users can vote to go to new raids next from those as well. When you are finished with the current raid (whether you actually do the raid or decide to go to a different one instead) you can type !next and Meowth will determine which raid is next by counting the reaction votes for each raid. Whichever raid has the most votes will be next, and Meowth will clean up its messages relating to the old raid and set up the train channel for the next one.

One thing to note here is that every Discord user still handles their own RSVPs for each raid during the train. Also, if there are any other channels dedicated to the same raid (whether a raid channel or a train channel) all RSVPs will be sent to all the channels so that everyone knows who's coming to the raid. So joining the train does not free you from updating your status. I imagine the typical use case will be one Discord user per car updating RSVPs for whoever is in that car, but you could also designate one person to handle RSVPs for everyone by including the whole train in that user's total.

The last thing I'll mention is that every time a user leaves a train either by sending !leave to the train channel or by using the reaction in the report channel, Meowth checks to see if there is anyone left in the train. If there is no one left in the train, Meowth will automatically end the train and delete the channel. I will probably add some sort of check for inactivity soon just in case people forget to leave their trains.

There is also some really cool quality of life features in this that I'm really happy about. If your server utilizes the gym database, Meowth will include the travel times between gyms that it knows about when asking you to select the next raid. This only works if the current raid is at a known gym. So this should help you figure out which raid you want to do based on which gym is closest and when the raids are expiring (all of which is information Meowth helpfully includes when asking you to vote on the next raid).

There's still quite a bit of refining that needs to be done on this one, but it's Friday and I managed to get it functional so I wanted to let you guys know about it! Go test it out on our support server!

Monday, March 4, 2019

Feature Spotlight: Trading

It's time for another somewhat-polished feature of Meowth 3.0 to be given the spotlight, and this time it's all about the revamped trade feature. This one was quite easy for the most part for a number of reasons. It was the last major thing I wrote for Meowth 2.0, and so it needed quite a bit less work to fit it into 3.0, as it's really the only 2.0 feature sort of written in the 3.0 style so to speak. Even in 2.0 it was its own module, it had a data class with methods... you know, the way people who actually know how to write Python do! So a straight port to 3.0 would have been very easy. But I didn't want to do just a straight port, so I added a few bells and whistles based on the feedback I've gotten for trading in 2.0.

What's Old

This is all going to feel very familiar if you've used the trade command at all in 2.0. The premise is basically the same. You use the trade command, and tell Meowth what Pokemon you are offering to trade. Meowth asks you what you will accept in exchange. You give it a list. Meowth creates a pretty message summarizing. Other people use reactions to make you an offer. You get a DM for each offer, and you can either accept or reject. If you accept an offer, the reactions on the original message are cleared and the message is edited to reflect the accepted offer.

What's New

The first big thing is you are now able to offer multiple Pokemon in one trade. If you do this, Meowth won't attach a sprite thumbnail to the trade message. Whenever someone makes an offer on your trade, Meowth asks which of the Pokemon you are offering they are wanting to trade for. Hopefully this streamlines the trading channels a lot since users don't have to make a whole bunch of trades if they have a whole lot to offer.

The next thing is the addition of a lot more detail. You can use the same strings to specify things like moveset and level that you would when reporting a wild Pokemon. So for instance if you are trading a Gengar with Shadow Claw, you can type:

!trade "Gengar @shadowclaw"

As with the wild command, for multiple words in the command to be treated as one argument - in this case, a Pokemon, you need to enclose each group of words in quotes. IVs cannot be specified for trade offers since those attributes are re-rolled.

When telling Meowth what Pokemon you will accept in exchange, you still separate Pokemon with a comma. This does mean you have two different ways of specifying a list of Pokemon in the same command, but it was the easiest way to code things, since in the first case the Discord library is parsing arguments in a command, whereas in the second the whole message content has to be handled as one string, and then split into multiple arguments.

There's also two new special arguments you can give when specifying Pokemon you will accept in exchange for your trade offer(s). If you are wanting to selflessly give away some rare Pokemon, you can type 'any' to let people know you will accept anything. If you are wanting something good in exchange but don't want to tie people down, you can type 'obo' to let people make you an offer that is not on your list. Other users can specify the Pokemon they're offering you in the same format that you specify your Pokemon. Attributes like shininess, gender, level, and movesets can all be specified.

In 2.0 there was a step for confirming a trade once it had taken place. This wasn't very useful in the first place and it often didn't work in the second. Additionally, in 2.0 trade offers would stop responding after a while. That issue shouldn't be present in this version. Also, in 2.0 Meowth enforced a "clean" trade channel and deleted all messages from other users. This will be an option in 3.0 but not enforced.

The new and improved trade feature is available to test on our support server. Go break it!

Roadmap Update

Finally, I wanted to give an update on the timetable for 3.0. Things are progressing pretty well at this point. I am getting to a busy time of year at work but I was able to get this feature done in about a week or so. Here's what's left to do, along with my estimates on how long each thing should take:
  • Research (1 week)
  • EX Raids (1-2 days)
  • Clean mode option (1-2 days)
  • Super secret feature (1 week)
  • Configure (1 week?)
  • Error handling, documentation, polish (1 week?)
So with all that, I'm hoping everything will be finished by the end of March. I realize I said the same thing at the beginning of February, but ¯\_(ツ)_/¯

That's all I have for now! Thanks as always for the support.

Monday, February 18, 2019

Feature Spotlight: Wild Spawn Reporting

It's time again to look at a core feature of the upcoming Meowth 3.0. This time I'll be sharing the progress that has been made on the wild spawn reporting feature. This one was much simpler to develop than the new raid module, and I'm pretty happy with how it's turning out. But let's get down to the details.

What's Old

First, you can keep using the wild command exactly as you have been and it will continue to work. The only things you'll need to learn are how to take advantage of the new features. The reaction for marking yourself as "on the way" to a spawn is still there, as is the reaction for saying a wild Pokemon has despawned.

What's New

The big thing is that you're able to give Meowth a lot more detail about the wild spawn, if you choose. Here are the attributes of a wild spawn you are able to specify:
  • CP
  • IVs
  • Level
  • Moveset
  • Gender
This is in addition to being able to specify the form of the species, for the odd cases of species like Castform and Alolan forms.

In order to report attributes of a wild spawn, you must use a system that is similar to the search parameters you can use in Pokemon Go. For instance, to specify that a wild spawn has 500 CP, you can add "cp500" to your report. Because you can now include multiple terms in describing the wild spawn, this creates some ambiguity when parsing the command arguments. Specifically, where does the Pokemon end and the location begin? To handle this ambiguity, multi-word arguments describing the wild Pokemon must be enclosed in quotation marks. This is also true in the raid module, but there it's usually limited to reporting Alolan form bosses.

One thing that was a priority for me with this new feature was making sure that users weren't forced to spend a lot of time typing out the command with all the information. I didn't want users to have to wait until after catching a Pokemon to report it with all its attributes. Because of these concerns, it's also possible to add the information to a wild report after the initial command. It works like this. Let's say you spot a Combee and report it immediately. Combee's a fairly rare spawn at the moment so you want your fellow trainers to have as much time as possible to get there and catch it.


After you catch the Combee yourself, you realize it is a female Combee - making the spawn even rarer and more valuable. To add this attribute, you can hit the "information" reaction and let Meowth now the Combee is female.


Meowth helpfully provides a list of attributes you can specify along with how to set each of them. Meowth treats each "word" as a separate attribute, so it's important that you don't leave space between 'cp' and the number. Once you have replied to the message, Meowth deletes your reaction, the message prompting for information, and your reply to it, leaving only the edited wild spawn.

What Else Is Going On Behind the Scenes?

Boy am I glad you asked. There's quite a bit! Meowth is first checking that the species is even available in the wild when you report it. It's also validating the attributes when you specify them - you can't report a male Nidoran♀ for instance. If you specify level and IVs, it will calculate the CP for you. If you specify just level and CP, it will check that the CP falls within the possible CP range for that level. If you specify a moveset, Meowth checks that that moveset is available to the Pokemon. If you specify gender, Meowth checks to see if the species is one of those that has gender differences in appearance, and if it is, Meowth displays the image of the correct gender.
Meowth also takes advantage of the "gym matching" functionality, searching for gyms or Pokestops that it has in its database to provide precise directions whenever possible.

Any Bugs or Missing Functionality?

Just a bit! There's a feature that asks you to clarify if it finds multiple possible matches for a Pokemon name. This can lead to some strange results - for instance if you report a wild Pikachu, Meowth asks you to clarify if you meant Pikachu or Pichu, despite the fact that Pichu doesn't spawn in the wild. This is not really a bug per se but it is odd. Also, at the moment Meowth doesn't distinguish between legacy moves and currently available moves. So it will allow you to report a wild Dragonite with Draco Meteor for example.

I'm Super Stoked When Can I Try This Awesome Feature And When Will 3.0 Be Actually Released Also Did You Spend All of Our Money Yet

First off, wow, maybe try some punctuation. Second, no I haven't spent any of your money yet. The credit I had from Google Cloud Platform finally ran out the other day, and I'm very happy to say that you guys have been generous enough to cover Meowth's current operating costs for several months. Third, you can try the new wild feature today! There's a new channel for it in the support server. And fourth, I'm hoping 3.0 will be out no later than a month from now. I still have to write the modules for research and trades, I still have to add EX raid functionality to the raid module, I want to add a couple of general purpose server administration tools, and of course I have to make it possible to actually configure the bot for each server. I don't anticipate those being very complicated since a lot of the underlying framework is similar. And then of course 3.0 needs some actual error handling and documentation before it's released. But I believe the hardest work is over and I'm excited to get this thing to a stable release and into your servers as soon as possible. Thanks again for all your support and feedback!

Changes to Research

More details on today's changes to the research command are below. A new optional argument has been added to the research command. Thi...