make mbux count towards spender badges

pull/225/head
Aevann 2024-03-09 09:39:23 +02:00
parent 999205c638
commit b8bbcef284
11 changed files with 41 additions and 41 deletions

View File

@ -84,8 +84,8 @@ class User(Base):
created_utc = Column(Integer) created_utc = Column(Integer)
admin_level = Column(Integer, default=DEFAULT_ADMIN_LEVEL) admin_level = Column(Integer, default=DEFAULT_ADMIN_LEVEL)
last_active = Column(Integer) last_active = Column(Integer)
coins_spent = Column(Integer, default=0) currency_spent_on_awards = Column(Integer, default=0)
coins_spent_on_hats = Column(Integer, default=0) currency_spent_on_hats = Column(Integer, default=0)
lootboxes_bought = Column(Integer, default=0) lootboxes_bought = Column(Integer, default=0)
chud = Column(Integer, default=0) chud = Column(Integer, default=0)
queen = Column(Integer, default=0) queen = Column(Integer, default=0)
@ -251,7 +251,6 @@ class User(Base):
def charge_account(self, currency, amount, reason=None, **kwargs): def charge_account(self, currency, amount, reason=None, **kwargs):
succeeded = False succeeded = False
charged_coins = 0
should_check_balance = kwargs.get('should_check_balance', True) should_check_balance = kwargs.get('should_check_balance', True)
@ -264,7 +263,6 @@ class User(Base):
if not should_check_balance or account_balance >= amount: if not should_check_balance or account_balance >= amount:
user_query.update({ User.coins: User.coins - amount }) user_query.update({ User.coins: User.coins - amount })
succeeded = True succeeded = True
charged_coins = amount
logs = [['coins', amount]] logs = [['coins', amount]]
elif currency == 'marseybux': elif currency == 'marseybux':
account_balance = self.marseybux account_balance = self.marseybux
@ -281,14 +279,13 @@ class User(Base):
subtracted_mbux = self.marseybux subtracted_mbux = self.marseybux
subtracted_coins = amount - subtracted_mbux subtracted_coins = amount - subtracted_mbux
if subtracted_coins > self.coins: if subtracted_coins > self.coins:
return (False, 0) return False
user_query.update({ user_query.update({
User.marseybux: User.marseybux - subtracted_mbux, User.marseybux: User.marseybux - subtracted_mbux,
User.coins: User.coins - subtracted_coins, User.coins: User.coins - subtracted_coins,
}) })
succeeded = True succeeded = True
charged_coins = subtracted_coins
logs = [['coins', subtracted_coins], ['marseybux', subtracted_mbux]] logs = [['coins', subtracted_coins], ['marseybux', subtracted_mbux]]
if succeeded: if succeeded:
@ -308,7 +305,7 @@ class User(Base):
else: else:
currency_log.balance = self.marseybux currency_log.balance = self.marseybux
return (succeeded, charged_coins) return succeeded
@property @property
@lazy @lazy

View File

@ -98,8 +98,8 @@ def stats():
"Users with a private profile": "{:,}".format(g.db.query(User).filter_by(is_private=True).count()), "Users with a private profile": "{:,}".format(g.db.query(User).filter_by(is_private=True).count()),
"Users with a verified email": "{:,}".format(g.db.query(User).filter_by(email_verified=True).count()), "Users with a verified email": "{:,}".format(g.db.query(User).filter_by(email_verified=True).count()),
"Coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()), "Coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()),
"Total award sales": "{:,}".format(g.db.query(func.sum(User.coins_spent)).scalar()), "Total currency spent on awards": "{:,}".format(g.db.query(func.sum(User.currency_spent_on_awards)).scalar()),
"Total hat sales": "{:,}".format(g.db.query(func.sum(User.coins_spent_on_hats)).scalar()), "Total currency spent on hats": "{:,}".format(g.db.query(func.sum(User.currency_spent_on_hats)).scalar()),
"Signups last 24h": "{:,}".format(g.db.query(User).filter(User.created_utc > day).count()), "Signups last 24h": "{:,}".format(g.db.query(User).filter(User.created_utc > day).count()),
"Total posts": "{:,}".format(g.db.query(Post).count()), "Total posts": "{:,}".format(g.db.query(Post).count()),
"Posting users": "{:,}".format(g.db.query(Post.author_id).distinct().count()), "Posting users": "{:,}".format(g.db.query(Post.author_id).distinct().count()),

View File

@ -49,7 +49,7 @@ def shop(v):
val["baseprice"] = int(val["baseprice"] / 0.75) val["baseprice"] = int(val["baseprice"] / 0.75)
val["price"] = int(val["price"] * v.award_discount) val["price"] = int(val["price"] * v.award_discount)
sales = g.db.query(func.sum(User.coins_spent)).scalar() sales = g.db.query(func.sum(User.currency_spent_on_awards)).scalar()
return render_template("shop.html", awards=list(AWARDS.values()), v=v, sales=sales) return render_template("shop.html", awards=list(AWARDS.values()), v=v, sales=sales)
@ -65,19 +65,19 @@ def buy_award(v, kind, AWARDS):
currency = 'coins/marseybux' currency = 'coins/marseybux'
charged = v.charge_account(currency, price, f"{AWARDS[kind]['title']} award cost") charged = v.charge_account(currency, price, f"{AWARDS[kind]['title']} award cost")
if not charged[0]: if not charged:
abort(400, f"Not enough {currency}!") abort(400, f"Not enough {currency}!")
v.coins_spent += charged[1] v.currency_spent_on_awards += price
if v.coins_spent >= 1000000: if v.currency_spent_on_awards >= 1000000:
badge_grant(badge_id=73, user=v) badge_grant(badge_id=73, user=v)
elif v.coins_spent >= 500000: elif v.currency_spent_on_awards >= 500000:
badge_grant(badge_id=72, user=v) badge_grant(badge_id=72, user=v)
elif v.coins_spent >= 250000: elif v.currency_spent_on_awards >= 250000:
badge_grant(badge_id=71, user=v) badge_grant(badge_id=71, user=v)
elif v.coins_spent >= 100000: elif v.currency_spent_on_awards >= 100000:
badge_grant(badge_id=70, user=v) badge_grant(badge_id=70, user=v)
elif v.coins_spent >= 10000: elif v.currency_spent_on_awards >= 10000:
badge_grant(badge_id=69, user=v) badge_grant(badge_id=69, user=v)
g.db.add(v) g.db.add(v)

View File

@ -24,7 +24,7 @@ def hats(v):
not_owned = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.submitter_id == None, HatDef.id.notin_(owned_hat_ids)).order_by(HatDef.price == 0, HatDef.price, HatDef.name).all() not_owned = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.submitter_id == None, HatDef.id.notin_(owned_hat_ids)).order_by(HatDef.price == 0, HatDef.price, HatDef.name).all()
hats = owned + not_owned hats = owned + not_owned
sales = g.db.query(func.sum(User.coins_spent_on_hats)).scalar() sales = g.db.query(func.sum(User.currency_spent_on_hats)).scalar()
num_of_hats = g.db.query(HatDef).filter(HatDef.submitter_id == None).count() num_of_hats = g.db.query(HatDef).filter(HatDef.submitter_id == None).count()
return render_template("hats.html", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats) return render_template("hats.html", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats)
@ -45,10 +45,10 @@ def buy_hat(v, hat_id):
abort(403, "This hat is not for sale!") abort(403, "This hat is not for sale!")
charged = v.charge_account('coins/marseybux', hat.price, f"<code>{hat.name}</code> hat cost") charged = v.charge_account('coins/marseybux', hat.price, f"<code>{hat.name}</code> hat cost")
if not charged[0]: if not charged:
abort(400, "Not enough coins/marseybux!") abort(400, "Not enough coins/marseybux!")
v.coins_spent_on_hats += charged[1] v.currency_spent_on_hats += hat.price
hat.author.pay_account('coins', hat.price * 0.1, f"Royalties for <code>{hat.name}</code> hat") hat.author.pay_account('coins', hat.price * 0.1, f"Royalties for <code>{hat.name}</code> hat")
new_hat = Hat(user_id=v.id, hat_id=hat.id) new_hat = Hat(user_id=v.id, hat_id=hat.id)

View File

@ -22,12 +22,12 @@ def leaderboard_marseybux(v):
leaderboard = Leaderboard("Marseybux", "marseybux", "marseybux", "Marseybux", None, Leaderboard.get_simple_lb, User.marseybux, v, lambda u:u.marseybux, g.db.query(User)) leaderboard = Leaderboard("Marseybux", "marseybux", "marseybux", "Marseybux", None, Leaderboard.get_simple_lb, User.marseybux, v, lambda u:u.marseybux, g.db.query(User))
return render_template("leaderboard.html", v=v, leaderboard=leaderboard) return render_template("leaderboard.html", v=v, leaderboard=leaderboard)
@app.get("/leaderboard/spent") @app.get("/leaderboard/currency_spent_on_awards")
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) @limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
@auth_required @auth_required
def leaderboard_spent(v): def leaderboard_currency_spent_on_awards(v):
leaderboard = Leaderboard("Coins spent on awards", "coins spent on awards", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, lambda u:u.coins_spent, g.db.query(User)) leaderboard = Leaderboard("Currency spent on awards", "currency spent on awards", "currency-spent-on-awards", "Currency", None, Leaderboard.get_simple_lb, User.currency_spent_on_awards, v, lambda u:u.currency_spent_on_awards, g.db.query(User))
return render_template("leaderboard.html", v=v, leaderboard=leaderboard) return render_template("leaderboard.html", v=v, leaderboard=leaderboard)
@app.get("/leaderboard/truescore") @app.get("/leaderboard/truescore")

View File

@ -25,9 +25,9 @@
<ul id="shop-stats" class="my-1 my-md-2"> <ul id="shop-stats" class="my-1 my-md-2">
<li class="mt-2">Number of hats you bought: {{v.num_of_owned_hats}}</li> <li class="mt-2">Number of hats you bought: {{v.num_of_owned_hats}}</li>
<li>Number of hats you designed: {{v.num_of_designed_hats}}</li> <li>Number of hats you designed: {{v.num_of_designed_hats}}</li>
<li>Coins you spent on hats: {{"{:,}".format(v.coins_spent_on_hats)}}</li>
<li>Number of hats: {{num_of_hats}}</li> <li>Number of hats: {{num_of_hats}}</li>
<li>Total hat sales: {{"{:,}".format(sales)}}</li> <li>Currency you spent on hats: {{"{:,}".format(v.currency_spent_on_hats)}}</li>
<li>Total currency spent on hats: {{"{:,}".format(sales)}}</li>
<li>Your current coins: {{"{:,}".format(v.coins)}}</li> <li>Your current coins: {{"{:,}".format(v.coins)}}</li>
{% if FEATURES['MARSEYBUX'] %} {% if FEATURES['MARSEYBUX'] %}
<li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li> <li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li>

View File

@ -8,7 +8,7 @@
<div class="mt-2" id="leaderboard-contents" style="text-align: center; margin-bottom: 1.5rem; font-size: 1.2rem"> <div class="mt-2" id="leaderboard-contents" style="text-align: center; margin-bottom: 1.5rem; font-size: 1.2rem">
<a {% if request.path in ["/leaderboard", "/leaderboard/coins"] %}class="font-weight-bolder"{% endif %} href="/leaderboard/coins">Coins</a> <a {% if request.path in ["/leaderboard", "/leaderboard/coins"] %}class="font-weight-bolder"{% endif %} href="/leaderboard/coins">Coins</a>
<a {% if request.path == "/leaderboard/marseybux" %}class="font-weight-bolder"{% endif %} href="/leaderboard/marseybux">Marseybux</a> <a {% if request.path == "/leaderboard/marseybux" %}class="font-weight-bolder"{% endif %} href="/leaderboard/marseybux">Marseybux</a>
<a {% if request.path == "/leaderboard/spent" %}class="font-weight-bolder"{% endif %} href="/leaderboard/spent">Coins spent on awards</a> <a {% if request.path == "/leaderboard/currency_spent_on_awards" %}class="font-weight-bolder"{% endif %} href="/leaderboard/currency_spent_on_awards">Currency spent on awards</a>
<a {% if request.path == "/leaderboard/truescore" %}class="font-weight-bolder"{% endif %} href="/leaderboard/truescore">Truescore</a> <a {% if request.path == "/leaderboard/truescore" %}class="font-weight-bolder"{% endif %} href="/leaderboard/truescore">Truescore</a>
<a {% if request.path == "/leaderboard/followers" %}class="font-weight-bolder"{% endif %} href="/leaderboard/followers">Followers</a> <a {% if request.path == "/leaderboard/followers" %}class="font-weight-bolder"{% endif %} href="/leaderboard/followers">Followers</a>
<a {% if request.path == "/leaderboard/posts" %}class="font-weight-bolder"{% endif %} href="/leaderboard/posts">Posts</a> <a {% if request.path == "/leaderboard/posts" %}class="font-weight-bolder"{% endif %} href="/leaderboard/posts">Posts</a>

View File

@ -26,8 +26,8 @@
<li>Number of lootboxes you bought: {{v.lootboxes_bought}}</li> <li>Number of lootboxes you bought: {{v.lootboxes_bought}}</li>
{% endif %} {% endif %}
<li>Number of awards you bought: {{v.num_of_bought_awards}}</li> <li>Number of awards you bought: {{v.num_of_bought_awards}}</li>
<li>Coins you spent on awards: {{"{:,}".format(v.coins_spent)}}</li> <li>Currency you spent on awards: {{"{:,}".format(v.currency_spent_on_awards)}}</li>
<li>Total award sales: {{"{:,}".format(sales)}}</li> <li>Total currency spent on awards: {{"{:,}".format(sales)}}</li>
<li>Your current coins: {{"{:,}".format(v.coins)}}</li> <li>Your current coins: {{"{:,}".format(v.coins)}}</li>
{% if FEATURES['MARSEYBUX'] %} {% if FEATURES['MARSEYBUX'] %}
<li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li> <li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li>

View File

@ -270,8 +270,8 @@
<p id="profile--info--casino-winnings">Casino winnings: {{u.winnings}}</p> <p id="profile--info--casino-winnings">Casino winnings: {{u.winnings}}</p>
<p id="profile--info--lottery-winnings">Lottery winnings: {{u.total_lottery_winnings}}</p> <p id="profile--info--lottery-winnings">Lottery winnings: {{u.total_lottery_winnings}}</p>
<p id="profile--info--hats-owned" {% if u.num_of_owned_hats >= hats_total %}class="profile-owned-all-hats"{% endif %}>{{u.num_of_owned_hats}} / {{hats_total}} hats owned ({{hats_owned_percent}})</p> <p id="profile--info--hats-owned" {% if u.num_of_owned_hats >= hats_total %}class="profile-owned-all-hats"{% endif %}>{{u.num_of_owned_hats}} / {{hats_total}} hats owned ({{hats_owned_percent}})</p>
<p id="profile--info--spent">Coins spent on awards: {{u.coins_spent}}</p> <p id="profile--info--spent">Currency spent on awards: {{u.currency_spent_on_awards}}</p>
<p id="profile--info--spent">Coins spent on hats: {{u.coins_spent_on_hats}}</p> <p id="profile--info--spent">Currency spent on hats: {{u.currency_spent_on_hats}}</p>
<p id="profile--info--effortposts"> <p id="profile--info--effortposts">
Effortposts made: <a href='/search/posts?q=author:{{u.username}}+effortpost:true'><b>{{u.effortposts_made}}</b></a> Effortposts made: <a href='/search/posts?q=author:{{u.username}}+effortpost:true'><b>{{u.effortposts_made}}</b></a>
@ -584,8 +584,8 @@
<p id="profile-mobile--info--casino-winnings">Casino winnings: {{u.winnings}}</p> <p id="profile-mobile--info--casino-winnings">Casino winnings: {{u.winnings}}</p>
<p id="profile-mobile--info--lottery-winnings">Lottery winnings: {{u.total_lottery_winnings}}</p> <p id="profile-mobile--info--lottery-winnings">Lottery winnings: {{u.total_lottery_winnings}}</p>
<p id="profile-mobile--info--hats-owned" {% if u.num_of_owned_hats >= hats_total %}class="profile-owned-all-hats"{% endif %}>{{u.num_of_owned_hats}} / {{hats_total}} hats owned ({{hats_owned_percent}})</p> <p id="profile-mobile--info--hats-owned" {% if u.num_of_owned_hats >= hats_total %}class="profile-owned-all-hats"{% endif %}>{{u.num_of_owned_hats}} / {{hats_total}} hats owned ({{hats_owned_percent}})</p>
<p id="profile-mobile--info--spent">Coins spent on awards: {{u.coins_spent}}</p> <p id="profile-mobile--info--spent">Currency spent on awards: {{u.currency_spent_on_awards}}</p>
<p id="profile-mobile--info--spent">Coins spent on hats: {{u.coins_spent_on_hats}}</p> <p id="profile-mobile--info--spent">Currency spent on hats: {{u.currency_spent_on_hats}}</p>
<p id="profile-mobile--info--effortposts"> <p id="profile-mobile--info--effortposts">
Effortposts made: <a href='/search/posts?q=author:{{u.username}}+effortpost:true'><b>{{u.effortposts_made}}</b></a> Effortposts made: <a href='/search/posts?q=author:{{u.username}}+effortpost:true'><b>{{u.effortposts_made}}</b></a>

View File

@ -0,0 +1,10 @@
alter table users rename column coins_spent to currency_spent_on_awards;
alter table users rename column coins_spent_on_hats to currency_spent_on_hats;
drop index users_coins_spent_on_hats_idx;
create index users_currency_spent_on_awards_idx ON public.users USING btree (currency_spent_on_awards desc);
update badge_defs set description='Spent 10,000 currency on awards' where id=69;
update badge_defs set description='Spent 100,000 currency on awards' where id=70;
update badge_defs set description='Spent 250,000 currency on awards' where id=71;
update badge_defs set description='Spent 500,000 currency on awards' where id=72;

View File

@ -125,7 +125,7 @@ CREATE TABLE public.users (
received_award_count integer DEFAULT 0 NOT NULL, received_award_count integer DEFAULT 0 NOT NULL,
truescore integer DEFAULT 0 NOT NULL, truescore integer DEFAULT 0 NOT NULL,
frontsize integer DEFAULT 25 NOT NULL, frontsize integer DEFAULT 25 NOT NULL,
coins_spent integer DEFAULT 0 NOT NULL, currency_spent_on_awards integer DEFAULT 0 NOT NULL,
marseybux integer DEFAULT 0 NOT NULL, marseybux integer DEFAULT 0 NOT NULL,
verifiedcolor character varying(6), verifiedcolor character varying(6),
hieroglyphs integer, hieroglyphs integer,
@ -159,7 +159,7 @@ CREATE TABLE public.users (
owoify integer, owoify integer,
marsify integer, marsify integer,
is_muted boolean DEFAULT false NOT NULL, is_muted boolean DEFAULT false NOT NULL,
coins_spent_on_hats integer DEFAULT 0 NOT NULL, currency_spent_on_hats integer DEFAULT 0 NOT NULL,
rainbow integer, rainbow integer,
spider integer, spider integer,
profanityreplacer integer DEFAULT 1 NOT NULL, profanityreplacer integer DEFAULT 1 NOT NULL,
@ -2391,12 +2391,6 @@ CREATE INDEX users_bite_idx ON public.users USING btree (bite);
CREATE INDEX users_chud_idx ON public.users USING btree (chud); CREATE INDEX users_chud_idx ON public.users USING btree (chud);
--
-- Name: users_coins_spent_on_hats_idx; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX users_coins_spent_on_hats_idx ON public.users USING btree (coins_spent_on_hats);
-- --
-- Name: users_created_utc_index; Type: INDEX; Schema: public; Owner: - -- Name: users_created_utc_index; Type: INDEX; Schema: public; Owner: -
@ -3313,4 +3307,3 @@ ALTER TABLE ONLY public.comments
-- --
-- PostgreSQL database dump complete -- PostgreSQL database dump complete
-- --