fsd
This commit is contained in:
parent
2e41b01bea
commit
63ebd12575
6 changed files with 169 additions and 96 deletions
|
@ -2,107 +2,107 @@ from json.encoder import INFINITY
|
||||||
import random
|
import random
|
||||||
|
|
||||||
def shuffle(stuff):
|
def shuffle(stuff):
|
||||||
random.shuffle(stuff)
|
random.shuffle(stuff)
|
||||||
return stuff
|
return stuff
|
||||||
|
|
||||||
class Slots:
|
class Slots:
|
||||||
command_word = "!slots"
|
command_word = "!slots"
|
||||||
minimum_bet = 5
|
minimum_bet = 5
|
||||||
maximum_bet = INFINITY
|
maximum_bet = INFINITY
|
||||||
payout_to_symbols = {
|
payout_to_symbols = {
|
||||||
2: ["👣", "🍀", "🌈", "⭐️"],
|
2: ["👣", "🍀", "🌈", "⭐️"],
|
||||||
3: ["🍎", "🔞", "⚛️", "☢️"],
|
3: ["🍎", "🔞", "⚛️", "☢️"],
|
||||||
5: ["✡️", "⚔️", "🍆", "🍒"],
|
5: ["✡️", "⚔️", "🍆", "🍒"],
|
||||||
12: ["🐱"]
|
12: ["🐱"]
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, g):
|
def __init__(self, g):
|
||||||
self.db = g.db
|
self.db = g.db
|
||||||
|
|
||||||
def check_for_slots_command(self, in_text, from_user, from_comment):
|
def check_for_slots_command(self, in_text, from_user, from_comment):
|
||||||
if self.command_word in in_text:
|
if self.command_word in in_text:
|
||||||
for word in in_text.split():
|
for word in in_text.split():
|
||||||
if self.command_word in word:
|
if self.command_word in word:
|
||||||
try:
|
try:
|
||||||
wager = word[len(self.command_word):]
|
wager = word[len(self.command_word):]
|
||||||
wager_value = int(wager, base=10)
|
wager_value = int(wager, base=10)
|
||||||
|
|
||||||
if self.wager_is_valid(from_user, wager_value):
|
if self.wager_is_valid(from_user, wager_value):
|
||||||
from_user.coins -= wager_value
|
from_user.coins -= wager_value
|
||||||
|
|
||||||
payout = self.determine_payout()
|
payout = self.determine_payout()
|
||||||
symbols = self.build_symbols(payout)
|
symbols = self.build_symbols(payout)
|
||||||
text = self.build_text(wager_value, payout)
|
text = self.build_text(wager_value, payout, from_user)
|
||||||
reward = wager_value * payout
|
reward = wager_value * payout
|
||||||
|
|
||||||
from_user.coins += reward
|
from_user.coins += reward
|
||||||
self.db.add(from_user)
|
self.db.add(from_user)
|
||||||
|
|
||||||
from_comment.slots_result = f'{symbols} {text}'
|
from_comment.slots_result = f'{symbols} {text}'
|
||||||
self.db.add(from_comment)
|
self.db.add(from_comment)
|
||||||
|
except: break
|
||||||
self.db.commit()
|
|
||||||
except: break
|
|
||||||
|
|
||||||
def wager_is_valid(self, from_user, wager):
|
def wager_is_valid(self, from_user, wager):
|
||||||
if (wager < self.minimum_bet):
|
if (wager < self.minimum_bet):
|
||||||
return False
|
return False
|
||||||
elif (wager > self.maximum_bet):
|
elif (wager > self.maximum_bet):
|
||||||
return False
|
return False
|
||||||
elif (wager > from_user.coins):
|
elif (wager > from_user.coins):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def determine_payout(self):
|
def determine_payout(self):
|
||||||
value = random.randint(0, 100)
|
value = random.randint(0, 100)
|
||||||
|
|
||||||
if value == 100:
|
if value == 100:
|
||||||
return 12
|
return 12
|
||||||
elif value >= 96:
|
elif value >= 96:
|
||||||
return 5
|
return 5
|
||||||
elif value >= 88:
|
elif value >= 88:
|
||||||
return 3
|
return 3
|
||||||
elif value >= 72:
|
elif value >= 72:
|
||||||
return 2
|
return 2
|
||||||
elif value >= 61:
|
elif value >= 61:
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def build_symbols(self, for_payout):
|
def build_symbols(self, for_payout):
|
||||||
all_symbols = []
|
all_symbols = []
|
||||||
|
|
||||||
for payout in self.payout_to_symbols:
|
for payout in self.payout_to_symbols:
|
||||||
for symbol in self.payout_to_symbols[payout]:
|
for symbol in self.payout_to_symbols[payout]:
|
||||||
all_symbols.append(symbol)
|
all_symbols.append(symbol)
|
||||||
|
|
||||||
shuffle(all_symbols)
|
shuffle(all_symbols)
|
||||||
|
|
||||||
if for_payout == 0:
|
if for_payout == 0:
|
||||||
return "".join([all_symbols[0], all_symbols[1], all_symbols[2]])
|
return "".join([all_symbols[0], all_symbols[1], all_symbols[2]])
|
||||||
elif for_payout == 1:
|
elif for_payout == 1:
|
||||||
indices = shuffle([0, 1, 2])
|
indices = shuffle([0, 1, 2])
|
||||||
symbol_set = ["", "", ""]
|
symbol_set = ["", "", ""]
|
||||||
[match_a, match_b, nonmatch] = indices
|
[match_a, match_b, nonmatch] = indices
|
||||||
[matching_symbol, other_symbol] = all_symbols
|
[matching_symbol, other_symbol] = all_symbols
|
||||||
symbol_set[match_a] = matching_symbol
|
symbol_set[match_a] = matching_symbol
|
||||||
symbol_set[match_b] = matching_symbol
|
symbol_set[match_b] = matching_symbol
|
||||||
symbol_set[nonmatch] = other_symbol
|
symbol_set[nonmatch] = other_symbol
|
||||||
|
|
||||||
return "".join(symbol_set)
|
return "".join(symbol_set)
|
||||||
else:
|
else:
|
||||||
relevantSymbols = shuffle(self.payout_to_symbols[for_payout])
|
relevantSymbols = shuffle(self.payout_to_symbols[for_payout])
|
||||||
symbol = relevantSymbols[0]
|
symbol = relevantSymbols[0]
|
||||||
return "".join([symbol, symbol, symbol])
|
return "".join([symbol, symbol, symbol])
|
||||||
|
|
||||||
def build_text(self, wager_value, result):
|
def build_text(self, wager_value, result, user):
|
||||||
if result == 0:
|
if result == 0:
|
||||||
return f'Lost {wager_value} Coins'
|
user.winnings -= wager_value
|
||||||
elif result == 1:
|
return f'Lost {wager_value} Coins'
|
||||||
return 'Broke Even'
|
elif result == 1:
|
||||||
elif result == 12:
|
return 'Broke Even'
|
||||||
return f'Jackpot! Won {wager_value * result} Coins'
|
elif result == 12:
|
||||||
else:
|
user.winnings += wager_value * result
|
||||||
return f'Won {wager_value * result} Coins'
|
return f'Jackpot! Won {wager_value * result} Coins'
|
||||||
|
else:
|
||||||
|
user.winnings += wager_value * result
|
||||||
|
return f'Won {wager_value * result} Coins'
|
|
@ -50,6 +50,7 @@ class User(Base):
|
||||||
verifiedcolor = Column(String)
|
verifiedcolor = Column(String)
|
||||||
marseyawarded = Column(Integer)
|
marseyawarded = Column(Integer)
|
||||||
longpost = Column(Integer)
|
longpost = Column(Integer)
|
||||||
|
winnings = Column(Integer, default=0)
|
||||||
unblockable = Column(Boolean)
|
unblockable = Column(Boolean)
|
||||||
bird = Column(Integer)
|
bird = Column(Integer)
|
||||||
email = deferred(Column(String))
|
email = deferred(Column(String))
|
||||||
|
|
|
@ -358,7 +358,15 @@ def leaderboard(v):
|
||||||
pos13 = (pos13+1, users13[pos13][1])
|
pos13 = (pos13+1, users13[pos13][1])
|
||||||
except: pos13 = (len(users13)+1, 0)
|
except: pos13 = (len(users13)+1, 0)
|
||||||
|
|
||||||
return render_template("leaderboard.html", v=v, users1=users1, pos1=pos1, users2=users2, pos2=pos2, users3=users3, pos3=pos3, users4=users4, pos4=pos4, users5=users5, pos5=pos5, users6=users6, pos6=pos6, users7=users7, pos7=pos7, users9=users9_25, pos9=pos9, users10=users10, pos10=pos10, users11=users11, pos11=pos11, users12=users12, pos12=pos12, users13=users13_25, pos13=pos13)
|
users14 = users.order_by(User.winnings.desc()).limit(25).all()
|
||||||
|
sq = g.db.query(User.id, func.rank().over(order_by=User.winnings.desc()).label("rank")).subquery()
|
||||||
|
pos14 = g.db.query(sq.c.id, sq.c.rank).filter(sq.c.id == v.id).limit(1).one()[1]
|
||||||
|
|
||||||
|
users15 = users.order_by(User.winnings).limit(25).all()
|
||||||
|
sq = g.db.query(User.id, func.rank().over(order_by=User.winnings).label("rank")).subquery()
|
||||||
|
pos15 = g.db.query(sq.c.id, sq.c.rank).filter(sq.c.id == v.id).limit(1).one()[1]
|
||||||
|
|
||||||
|
return render_template("leaderboard.html", v=v, users1=users1, pos1=pos1, users2=users2, pos2=pos2, users3=users3, pos3=pos3, users4=users4, pos4=pos4, users5=users5, pos5=pos5, users6=users6, pos6=pos6, users7=users7, pos7=pos7, users9=users9_25, pos9=pos9, users10=users10, pos10=pos10, users11=users11, pos11=pos11, users12=users12, pos12=pos12, users13=users13_25, pos13=pos13, users14=users14, pos14=pos14, users15=users15, pos15=pos15)
|
||||||
|
|
||||||
@app.get("/@<username>/css")
|
@app.get("/@<username>/css")
|
||||||
def get_css(username):
|
def get_css(username):
|
||||||
|
|
|
@ -231,7 +231,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if c.slots_result %}
|
{% if c.slots_result %}
|
||||||
<span style="position: relative; top: 2px; margin-left: 0.5rem">{{c.slots_result.split(' ')[0]}} <em>{{c.slots_result.split(' ')[1]}}</em></span>
|
<em style="position: relative; top: 2px; margin-left: 0.5rem">{{c.slots_result}}</em>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if c.active_flags %}
|
{% if c.active_flags %}
|
||||||
|
|
|
@ -419,6 +419,68 @@
|
||||||
</table>
|
</table>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
<h5 style="font-weight:bold;text-align: center">Top 25 by slot winnings</h5>
|
||||||
|
<pre></pre>
|
||||||
|
<div class="overflow-x-auto"><table class="table table-striped mb-5">
|
||||||
|
<thead class="bg-primary text-white">
|
||||||
|
<tr>
|
||||||
|
<th style="font-weight:bold">#</th>
|
||||||
|
<th style="font-weight:bold">Name</th>
|
||||||
|
<th style="font-weight:bold">Slot winnings</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for user in users14 %}
|
||||||
|
<tr {% if v.id == user.id %}class="self"{% endif %}>
|
||||||
|
<td style="font-weight:bold">{{loop.index}}</td>
|
||||||
|
<td><a style="color:#{{user.namecolor}};font-weight:bold" href="/@{{user.username}}"><img alt="@{{user.username}}'s profile picture" loading="lazy" src="{{user.profile_url}}" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}}"{% endif %}>{{user.username}}</span></a></td>
|
||||||
|
<td style="font-weight:bold">{{user.winnings}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
{% if pos14 > 25 %}
|
||||||
|
<tr style="border-top:2px solid var(--primary)">
|
||||||
|
<td style="font-weight:bold">{{pos1}}</td>
|
||||||
|
<td><a style="color:#{{v.namecolor}};font-weight:bold" href="/@{{v.username}}"><img alt="@{{v.username}}'s profile picture" loading="lazy" src="{{v.profile_url}}" class="pp20"><span {% if v.patron %}class="patron" style="background-color:#{{v.namecolor}}"{% endif %}>{{v.username}}</span></a></td>
|
||||||
|
<td style="font-weight:bold">{{v.winnings}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<h5 style="font-weight:bold;text-align: center">Bottom 25 by slot winnings</h5>
|
||||||
|
<pre></pre>
|
||||||
|
<div class="overflow-x-auto"><table class="table table-striped mb-5">
|
||||||
|
<thead class="bg-primary text-white">
|
||||||
|
<tr>
|
||||||
|
<th style="font-weight:bold">#</th>
|
||||||
|
<th style="font-weight:bold">Name</th>
|
||||||
|
<th style="font-weight:bold">Winnings</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for user in users15 %}
|
||||||
|
<tr {% if v.id == user.id %}class="self"{% endif %}>
|
||||||
|
<td style="font-weight:bold">{{loop.index}}</td>
|
||||||
|
<td><a style="color:#{{user.namecolor}};font-weight:bold" href="/@{{user.username}}"><img alt="@{{user.username}}'s profile picture" loading="lazy" src="{{user.profile_url}}" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}}"{% endif %}>{{user.username}}</span></a></td>
|
||||||
|
<td style="font-weight:bold">{{user.winnings}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
{% if pos15 > 25 %}
|
||||||
|
<tr style="border-top:2px solid var(--primary)">
|
||||||
|
<td style="font-weight:bold">{{pos1}}</td>
|
||||||
|
<td><a style="color:#{{v.namecolor}};font-weight:bold" href="/@{{v.username}}"><img alt="@{{v.username}}'s profile picture" loading="lazy" src="{{v.profile_url}}" class="pp20"><span {% if v.patron %}class="patron" style="background-color:#{{v.namecolor}}"{% endif %}>{{v.username}}</span></a></td>
|
||||||
|
<td style="font-weight:bold">{{v.winnings}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
|
||||||
|
</pre>
|
||||||
<style>
|
<style>
|
||||||
.self {
|
.self {
|
||||||
border-top:2px solid var(--primary);
|
border-top:2px solid var(--primary);
|
||||||
|
|
|
@ -291,6 +291,7 @@
|
||||||
<p>User ID: {{u.id}}</p>
|
<p>User ID: {{u.id}}</p>
|
||||||
<p>Coins spent: {{u.coins_spent}}</p>
|
<p>Coins spent: {{u.coins_spent}}</p>
|
||||||
<p>True score: {{u.truecoins}}</p>
|
<p>True score: {{u.truecoins}}</p>
|
||||||
|
<p>Slot winnings: {{u.winnings}}</p>
|
||||||
{% if u.is_private %}
|
{% if u.is_private %}
|
||||||
<p>User has private mode enabled.</p>
|
<p>User has private mode enabled.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -573,6 +574,7 @@
|
||||||
<p>User ID: {{u.id}}</p>
|
<p>User ID: {{u.id}}</p>
|
||||||
<p>Coins spent: {{u.coins_spent}}</p>
|
<p>Coins spent: {{u.coins_spent}}</p>
|
||||||
<p>True score: {{u.truecoins}}</p>
|
<p>True score: {{u.truecoins}}</p>
|
||||||
|
<p>Slot winnings: {{u.winnings}}</p>
|
||||||
{% if u.is_private %}
|
{% if u.is_private %}
|
||||||
<p>User has private mode enabled.</p>
|
<p>User has private mode enabled.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue