if you are not familiar with the tool, here's the initial post : https://steemit.com/downvotes/@howo/introducing-downvote-control-tool-an-open-source-downvote-tool
tl;dr : This is a tool designed to empower everyone to downvote by creating a toolbox with lots of parameters so that everyone can have their own customized downvoting campaign and target just what they believe is abuse.
It's been three weeks. This week has been mostly implementing features and improving the UI/UX.
You can already find all of the updates live on https://downvotecontrol.com
I felt that the way the global settings were displayed wasn't really pretty so I took some time to trying out a few different layouts, I thoughts of doing tabs like for the other settings or displaying them in a table. But ultimately went with aligning everything, I am still undecided and might go for the table design ultimately because I am unhappy with the way the inputs look like currently.
I did a lot of small UI and UX changes that aren't really visible but that adds up and make up for a nicer experience. For instance you can now use the enter key to perform actions like add, save, login etc
Thanks to some of last week's work I was able to push this feature. It's a list of all the votes that you did using downvotecontrol, including why you did them, so you can easily see how your downvote settings are working and if you see yourself downvoting things that you shouldn't be downvoting you can easily adjust your settings and remove your upvotes/downvotes using the unvote button. Looking for someone ? A specific post ? Or a specific vote ? Everything in this table is searchable.
So if I search for "100" it will show me all the votes where I voted at 100%, if I search for "trail downvote" it will show me all the votes that I did while trailing someone. Etc etc, I really like this search feature because it allows you to basically search for whatever you want. Oh and it's dynamic, it will show you results as you type.
This feature might be a little controversial but I felt that it was needed. The concept is simple : downvote an user with y% whenever one of his post or comment reaches a payout higher than x$
Since explaining the feature was so simple, I'll explain some of the algorithm choices that I did :
I spent quite some time figuring out a way to make it scale, In the first version I refreshed the payout whenever I detected a vote was done on this post, but during tests I realized that some posts recieve thousands of upvotes, making me make thousands of useless calls to the steemit api.
The best solution
So I toyed around a few ideas. I think the best way to tackle this is to use a hivemind node and just call your db locally every x minutes on tracked hitlist authors, and if one of their posts has a payout that is higher than what is written in the hitlist, make a vote. I think this scales very well and can easy scale even more if I "mark" posts that were voted in the past x minutes and only check those. This would basically allow the feature to scale extremelly well and even if you were to hitlist all the active posts on the chain, the tool could handle it.
But it has a huge drawback : it requires you to have a hivemind instance, which consumes a lot of computing power and memory. Currently the tool requires very little ressources ( live version is currently hosted on a 5$ a month digitalocean doplet), I already host and pay for a hivemind node so I could just set the live version to use that node but it means that if anyone wants to run downvotecontrol (it's open source for a reason), their costs will be drastically different. Which I absolutely want to avoid as I want to let anyone run their own version.
The actual best solution
Hence why I decided to go for an alternative version. On my tests it could scale pretty well so I am pretty confident that this is a good solution in terms of costs vs scaling potential. Basically whenever a vote is casted on a post I set a timer stating "I will check in 30 seconds the post payout", but if I detect another vote on it, the timer gets refreshed and we wait 30 more seconds. This is especially useful to handle the load when a lot of people trail each others and you have like 50 votes in the span of 10-15 seconds. So instead of making 50 calls you only make one.
Anyways, I could ramble about technicalities for hours and this update is getting pretty long so I'll stop there :p
as always you can find the code here :