SteemAX 1.6 ~ Automatically Accept 1:1 Invites, Set Vote Power Threshold, Create Non-expiring Exchanges, Top Users Page
SteemAX helps minnow content-creators and whale curators
by automating an exchange of upvotes between their quality blog posts, allowing both 1 to 1 as well as disproportional exchanges that grant bigger curations, better support than a bid bot, and the long-term support they both deserve.
SteemAX now provides users with the ability to save certain account settings that make using SteemAX more efficient and easier to use. When users log into SteemAX they will now see two new options below the invite creation form. This is the "Auto Accept 1:1 Invites" option and the "Vote Power Threshold" setting.
To save either of these settings a user must log into SteemAX create a new invite. The settings can be changed each time a new invite is created.
Automatically Accept 1:1 Invites
Users now have the ability to automatically accept an invite that is set to a ratio of 1:1. To enable this they simply log in to the invite creation form and check the checkbox that says "Auto accept 1:1 invites" when creating an invite.
Anybody that sends an invite to a user that has enabled this feature and at the ratio of 1:1 will immediately receive a reply message that the exchange has been accepted and that the exchange will begin immediately.
To accomplish this:
First, a new column was added to the
users database table.
AutoAccept varchar(5) DEFAULT "0"
A new function was added to
axdb.py that fetches the value in the
users table and returns true of that user has enabled Auto Accept.
def auto_accept(self, acct): """ Determines if auto accept is on or off """ if self.get_results('SELECT AutoAccept FROM users' + ' WHERE Account = %s;', acct): if self.dbresults == "1": return True else: return False else: return False
Another function was created to fetch the ratio of the invite so that it can be ensured that is is indeed 1:1. Perhaps in a future release of SteemAX this can be adjusted.
def get_ratio(self, memoid): """ Gets the ratio of an invite. This is necessary for the invite auto accept feature. """ if self.get_results('SELECT Ratio ' + 'FROM axlist WHERE MemoID = %s;', memoid): return self.dbresults else: return False
When the user saves their settings there are placed into the database table with this function.
def set_settings(self, acct, autoaccept, threshold): """ Sets the auto accept feature to on or off. """ if float(autoaccept) != 1: autoaccept = "0" if int(threshold) > 100 or int(threshold) < 0: threshold = "80" if self.commit('UPDATE users SET AutoAccept = %s, Threshold = %s' + ' WHERE Account = %s;', autoaccept, threshold, acct): return True else: return False
Finally, an if statement was added to the
Reaction class in
axtrans.py that handles the invite and automatically accepts it.
# if the rstatus is -1 then the exchange invite has been # created in the database but not yet sent to the invitee. if self.db.auto_accept(acct2) is True and int(ratio) == 1 and rstatus < 0: # The accept message is sent "automatically" # "refund" in this case means send it back to sender self.accepted_msg(acct2, memoid) self.reaction = "refund"
Set Vote Power Threshold
Another option that can now be saved is the "Vote Power Threshold." When the Vote Power Threshold is exceeded exchanges will temporarily halt until the user's vote power has returned to above the threshold setting. This can be set in the same way as the auto accept invites: simply log into the invite creation form then under "Settings" change the value for the threshold when creating a new invite.
Having a vote power threshold is a necessary feature in order for non-expiring invites to not adversely affect vote power and resource credits.
NOTE: All current members of SteemAX have been set to a default threshold of 80%.
To accomplish this:
set_settings function is already mentioned above. Besides setting the auto accept feature is saves the threshold setting as well. A function was also created in
axdb.py to fethc the threshold value from the database:
def threshold(self, acct): """ Returns the threshold value for votepower """ if self.get_results('SELECT Threshold FROM users' + ' WHERE Account = %s;', acct): return self.dbresults else: return False
eligible_votes function in the
Axverify class was updated to include these if states excluding accounts that have vote power values that have fallen below their threshold setting.
v1 = self.get_vote_value(account1, percentage, vpow) threshold = db.threshold(account1) if int(self.steem.vpow) < int(threshold): self.msg.message(account1 + " has a vote power of " + str(self.steem.vpow) + " which is below their threshold of " + threshold) return False v2 = self.get_vote_value(account2, 100, vpow) threshold = db.threshold(account2) if int(self.steem.vpow) < int(threshold): self.msg.message(account2 + " has a vote power of " + str(self.steem.vpow) + " which is below their threshold of " + threshold) return False
Create Non-expiring Exchanges
Users can now create invites to exchanges that do not expire, making the maintenance of their account much more manageable and efficient. The ability to create expiring exchanges still exists, and a user simply needs to choose this from the "Exchange Duration" drop down box on the invite creation form.
To accomplish this:
When the expire function is run is checks to see if the duration is larger than zero. If not it's a non-expiring exchange and is skipped.
if (datetime.strptime(str(row), '%Y-%m-%d %H:%M:%S') + timedelta(days=int(row)) < datetime.now()) and int(row) > 0: self.commit("UPDATE axlist SET Status = 4 WHERE ID = %s;", row) self.msg.message(row + " vs. " + row + " has expired.")
Now visitors can see a list of the top 100 users of SteemAX. This is ordered by the total number of exchange invites created by that user (not necessarily the active exchanges). Visitors can also see whether one of these top 100 users automatically accepts 1:1 invites. This can help newcomers to SteemAX find people to immediately begin exchanges with.
To accomplish this:
get_users was added to
axdb.py that fetches the top 100 users based on total exchanges created.
def get_users(self): """ Returns a list of top 100 users """ if self.get_results('SELECT users.Account, users.AutoAccept, users.Time, ' + 'a.Total + b.Total AS TheTotal ' + 'FROM users LEFT JOIN ' + '(SELECT Account1, COUNT(*) AS Total ' + 'FROM axlist GROUP BY Account1) AS a ' + 'ON users.Account = a.Account1 ' + 'LEFT JOIN (SELECT Account2, COUNT(*) AS Total ' + 'FROM axlist GROUP BY Account2) AS b ' + 'ON users.Account = b.Account2 ' + 'WHERE 1 ORDER BY TheTotal DESC LIMIT 100;'): return self.dbresults else: return False
users_page was added to
web.py to display the list.
def users_page(self): """ Creates a page that displays the top 100 users """ users = self.db.get_users() boxtemplate = self.load_template("templates/userbox.html") userbox = "" for user in users: autoaccept = "No" if int(user) == 1: autoaccept = "Yes" box = self.make_page(boxtemplate, ACCOUNT=user, AUTOACCEPT=autoaccept, TOTAL=user) userbox = userbox + box pagetemplate = self.load_template("templates/user.html") return ("\r\n" + self.make_page(pagetemplate, USERBOX=userbox))
In the future more contributors will be brought into the fold
via Task Requests to help improve the functionality of the site and most especially the look and feel. After all, projects always benefit from the synergistic action of teamwork.
Please contact Mike (Mike-A) on Discord
Thank You To The Top Users of SteemAX!
@mmmmkkkk311, @apoloo1, @davedickeyyall, @shaman-ra, @jecminek, @annaabi, @gungunkrishu, @jozef230, @camiloferrua, @alexworld, @manicesoteric, @artturtle, @onealfa, @kryptomario, @slutwife, @eddiespino, @adeljose, @wdougwatson, @bearbear613, @lilixblack, @werpoli, @sipahikara, @johngreenfield, @kargul09, @amosbastian, @ookamisuuhaisha, @travelnepal, @genievot, @robb-27, @arena11, @voteyourcrypto, @mariuszkarowski, @ganeshkadam9503, @ajayyy, @joechiappetta, @adrimonte, @brosol, @cyrusik, @momzillanc, @miriamslozberg, @laritheghost, @flash07, @jaff8, @browery, @lenonmc21, @felipejoys, @bethvalverde, @mcoinz79, @zumerret, @tomfw, @a0i, @derekrichardson, @steemitgeek, @maxofp2p, @shawnalchemi, @flashcards, @eii, @gilabola.mania, @kara65, @nazaretprime, @outwork, @andrejcibik, @pataty69, @baro89, @frankremmy, @steemit-legacies, @kamilason, @steveconnor, @mizej, @mrplokmi, @ziqifuady, @jason04, @alpayasteem, @primeradue, @bliki, @aneilpatel, @usman93, @fredfred, @robertpayne114, @solocult, @shookriya, @hoodsly, @maerod, @krasnalek, @mohammad12