Fooling The Imposter: An interview with programmers JRWR and Leo Verto

In the aftermath of Imposter’s sudden end, /u/Rytho had the chance to talk with two of the leading programmers in the Knight cause, JRWR and Leo Verto, creators of ‘ImposterBot’ and ‘Doorman’ respectively.  Together, the two of them had helped hundreds of knights defeat the imposter.


R: How did you get involved with the knights?

JRWR: I saw the April Fools Project, then saw the discord post and got an interview. Overall, I was in April Knights no less than 2 to 3 minutes after I found out about the event. From there, I started looking at bots and wanting to save as much data as I can.

Leo: I got involved because Gryph asked me to build Squire for the Knights a while ago, I was mostly involved with ccKufi before that. I’ve participated in April Fools’ events since Robin (technically button, filthy 59er). That’s when I started scripting.

R: What happened after you found the discord/got involved with imposter? Anything interesting happen in your interview?

Leo: I was already a knight before this event and my interview was pretty much just a formality to get me in. Gryph had asked me out of the blue to build Squire since he knew I was a dev from our collaboration in previous events.

JRWR: Well, My Interviewer was really impressed with what I had already done. I linked my Twitter, Github, The whole shebang and was put into place. At that point, I was in 4 other discords and was hunting for bots people had made.

R: Must have been a very talented interviewer

JRWR:  It was Rytho

R: Did it take long for you to get Arcana access? What bots did you see first?

JRWR: The core of the bot comes from the /r/Imposter Discord. He had it written quickly, but didn’t want to release it because he did not believe in it

R: That bot was just a scraper right, just collecting data?

JRWR: It was a randomly choosing entries, that’s the first design of from the OG dev

R: What about you Leo, walk me through the development of doorman

Leo: Alright, first thing I did for imposter was to build this website to generate answers that humans would understand to be human but the bot could not replicate A while later, I was invited to a group voice chat on Narrator Nexus where devs from all factions were brainstorming.

JRWR: Same, #teir20

Leo: Up until that point most data collection had been manual so I looked into how to get the data directly out of the Imposter app JRWR mentioned via a userscript.

R: And JRWR you changed it to store information?

JRWR: Correct. That was the first thing I did. Then I started getting anyone to run it I could.

Leo: It took me around two hours to get my script up and by then abra’s DB and API was up.

When someone linked JRWR’s script, we invited him as well.

R: Was there a lot of coordination between the different devs? Where did you mostly coordinate?

Leo: There was a private group chat.

JRWR: Ya! The backroom.

Leo: abra looked into importing JRWR’s data but eventually had to go to sleep and since I had no plan of doing that, I went ahead and hooked into the DB directly. I started using ocean’s data as another source not long after.

R: What were the pros and cons of importing JRWR’s data vs. hooking in directly?

Leo: abra was focused on keeping his database as clean and free of duplicates as possible and importing the data would’ve meant that Doorman only had to check one source.

JRWR:  At this time I started getting integrated with everyone, and right off the bat I knew my database would be useful. I went for the far and wide approach, and it seemed to work

Lots of tech hurdles to overcome due to traffic.

R: How effective were the first versions of your code, and did you get the chance to help out each other much?

JRWR: The first day, Doorman didn’t use spacescience (JRWR’s database) and we did no checking ourselves-it was purely random.  The next day, (the ImposterBot) started checking answers like Doorman did to choose the answers. We started to see 80% winrates, it was great. Mind you at this point, Our codebases depended on one another

Leo: The very first version of Doorman only ran the answers against abra’s detector, which looked fancy but wasn’t too useful – it was especially fooled by people trying to appear like the imposter. Shortly after that it started submitting to and using abra’s database, which improved it a bit. The real big improvement was using spacescience(JRWR’s database) though.

Oh yeah, since I had basically written code for checking all the different databases, I offloaded it into a library (Doorman-lib) and ImposterBot(JRWR’s bot) ended up using that.

R: Abra’s detector used what exactly? Was it entirely replaced by database checking?

Leo: It was the percentage thingy (gave you a percent chance of being from the imposter), it wasn’t entirely replaced. Later it was folded into some other scripts.

R: Why were there three scripts out at that point?

JRWR: I didn’t know about Doorman until the second day really.

Leo: The scripts ended up having different approaches, which worked out really well. If people wanted long streaks, they used Doorman. If they wanted to help feed the DB and to identify lots of imposters, they used ImposterBot. Or just both at the same time, which apparently worked as well.

R: Were you aware of what r/betheimposter were doing and what we were doing to them?

JRWR: Yes, I had several people DM me about BTI toomfoolery around April 3rd at 9AM. Some AKs had DMed me screenshots of BTI plans.

Leo: To be honest, the whole thing was starting to get a bit boring, until BTI showed up. We were getting 90+% winrates and  the overall Imposter winrate was just dropping. A bunch of people in #general basically spammed the invite link to their discord and then started accusing each other of being spies, that was fun.

JRWR:  I had methods in place on day 1 to spot evil doers, well I knew I had enough data to do it, just not the methods

R: Were either of you involved in creating the fake script we planted there?

JRWR: Bwhahahaha That was f—ing great!

Leo: But I can tell you that even outside of the knights, there were people spying on BTI with access to their trusted chat.

JRWR: I had three groups all reporting to me.

R: Snakeroom?

Leo: Snakeroom showed up pretty late, I didn’t really talk to them during the event.

JRWR: They downloaded our DB a few times but I won’t comment who the third group were 😉


R: That’s codename ‘Robin‘ right?

Leo: Yep

R: I am hoping we give that knight a medal. So how were you involved with it?

Leo: Yeah, I’m pretty sure most of their scripts actually helped us. [REDACTED] was the only one in BTI who could read JavaScript.

R: JRWR what happened next? did they try to poison your DB? Or did the major wave of people supplying data happen?

JRWR: There was an attempt, (to poison the DB) but they didn’t have the numbers to do it really. First off, they wanted to use my database to feed back into my own. Thing is, it’s so damn large, it takes like 4 hours to import. Hell, to do a lookup, it’s something like 20 seconds right now to pick a random row. Now, I had turned on my firewalls to max, and had gotten a list of all “approved” users I know who have been submitting good data. I was going to use that list and throw everything out, so it was all for nothing anyway.

Leo: While JRWR was doing that, I looked into how to deal with false data in the clients. Essentially if I were to build that into Doorman-lib, all users of Doorman and ImposterBot should be safe. So I added a reporting function, that could detect if for a given message, there were conflicting entries, and then would not use that answer and instead send a report to JR. I later ended up building a couple more features into the library and Doorman, namely the option to require multiple independent reports before considering a database entry to really be human, but the event ended only a couple hours after that.

JRWR: And the report count(of bad data) was so low, I stopped caring really. We were attacking it on many fronts. the total estimated bad data is 10k rows out of 27 million. By that point in time the users going for high streaks had moved away from doorman though and mostly used a third-party fork of ImposterBot that just reported a question (to reddit admins) when it was unsure to get new answers. Which is something even we thought of as cheating. :stuck_out_tongue:

R: It ended too quickly then huh?

Leo: I felt it ended way too soon, I’m pretty sure this has been the shortest April Fools’ event we’ve ever had, right? On the other hand, there was not much left to do, our scripts were probably the majority of traffic and most human players had probably dropped out of the game because there was not much for them as individuals to do. As a coder though, this was awesome. I really enjoyed collaborating with all the devs. 🙂 And there’s nothing better than users from five different groups using your scripts.

R: What would you say to other programmers considering getting involved?

Leo:There’s always room for more people helping us work towards whatever goal we’ve set for the current event and every userscript or bot author I know is happy to see pull requests. And this is a great way to get started with web programming.

JRWR: Go look at the repo for imposterbot and all the PRs we handled-I woke up to a completely different bot due to PRs and Dim handling it in EU timezone (PR, AKA Pull Requests are little mods to the code awaiting to be approved)

R: Any shout outs?

JRWR: Powerlang for being evil

Leo: abra of course, for building the backend for Doorman, the Ocean guys for their database and great API and everyone who submitted pull requests to my repo, namely ComputerGenius, wherron, qii, RockfordRoe, moonrisewarrior, and freundtech.  I got to know a bunch of new people, became more integrated into the knights and just had a really good time overall.