forked from rDrama/rDrama
Move more stuff to proper location
parent
d1f0f7a164
commit
a0cc7e1cf6
|
@ -173,6 +173,7 @@ if SITE in {'rdrama.net','devrama.xyz'}:
|
||||||
"6": "947236351445725204",
|
"6": "947236351445725204",
|
||||||
"7": "886781932430565418",
|
"7": "886781932430565418",
|
||||||
}
|
}
|
||||||
|
|
||||||
elif SITE == "pcmemes.net":
|
elif SITE == "pcmemes.net":
|
||||||
HOLE_COST = 10000
|
HOLE_COST = 10000
|
||||||
NOTIFICATIONS_ID = 1046
|
NOTIFICATIONS_ID = 1046
|
||||||
|
@ -1013,3 +1014,20 @@ procoins_li = (0,2500,5000,10000,25000,50000,125000,250000)
|
||||||
linefeeds_regex = re.compile("([^\n])\n([^\n])", flags=re.A)
|
linefeeds_regex = re.compile("([^\n])\n([^\n])", flags=re.A)
|
||||||
|
|
||||||
def make_name(*args, **kwargs): return request.base_url
|
def make_name(*args, **kwargs): return request.base_url
|
||||||
|
|
||||||
|
# Lottery
|
||||||
|
LOTTERY_TICKET_COST = 12
|
||||||
|
|
||||||
|
# The amount of dramacoins permanently removed from the economy to reduce expected value
|
||||||
|
LOTTERY_SINK_RATE = 3
|
||||||
|
|
||||||
|
# The amount of dramacoins the lottery founders receive
|
||||||
|
LOTTERY_ROYALTY_RATE = 1
|
||||||
|
|
||||||
|
# The account in which royalties are to be deposited
|
||||||
|
LOTTERY_ROYALTY_ACCOUNT_ID = 9
|
||||||
|
# LOTTERY_ROYALTY_ACCOUNT_ID = 8239 # (McCoxmaul)
|
||||||
|
|
||||||
|
# The account in which the prize is held to be accessed by anyone
|
||||||
|
LOTTERY_MANAGER_ACCOUNT_ID = 3
|
||||||
|
# LOTTERY_MANAGER_ACCOUNT_ID = 11651 (Lottershe)
|
|
@ -3,50 +3,39 @@ from random import choice
|
||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from files.helpers.alerts import *
|
from files.helpers.alerts import *
|
||||||
from files.helpers.wrappers import *
|
from files.helpers.wrappers import *
|
||||||
|
from flask import g
|
||||||
LOTTERY_TICKET_COST = 12
|
from .const import *
|
||||||
|
|
||||||
# The amount of dramacoins permanently removed from the economy to reduce expected value
|
|
||||||
SINK_RATE = 3
|
|
||||||
|
|
||||||
# The amount of dramacoins the lottery founders receive
|
|
||||||
ROYALTY_RATE = 1
|
|
||||||
|
|
||||||
# The account in which royalties are to be deposited
|
|
||||||
ROYALTY_ACCOUNT_ID = 9
|
|
||||||
|
|
||||||
# The account in which the prize is held to be accessed by anyone
|
|
||||||
MANAGER_ACCOUNT_ID = 3
|
|
||||||
|
|
||||||
|
|
||||||
def get_active_lottery(g):
|
def get_active_lottery():
|
||||||
return g.db.query(Lottery).order_by(Lottery.id.desc()).filter(Lottery.is_active).one_or_none()
|
return g.db.query(Lottery).order_by(Lottery.id.desc()).filter(Lottery.is_active).one_or_none()
|
||||||
|
|
||||||
|
|
||||||
def get_users_participating_in_lottery(g):
|
def get_users_participating_in_lottery():
|
||||||
return g.db.query(User).filter(User.currently_held_lottery_tickets > 0).all()
|
return g.db.query(User).filter(User.currently_held_lottery_tickets > 0).all()
|
||||||
|
|
||||||
|
|
||||||
def get_active_lottery_stats(g):
|
def get_active_lottery_stats():
|
||||||
active_lottery = get_active_lottery(g)
|
active_lottery = get_active_lottery()
|
||||||
participating_users = get_users_participating_in_lottery(g)
|
participating_users = get_users_participating_in_lottery()
|
||||||
|
|
||||||
return None if active_lottery is None else active_lottery.stats, len(participating_users)
|
return None if active_lottery is None else active_lottery.stats, len(participating_users)
|
||||||
|
|
||||||
|
|
||||||
def end_lottery_session(g):
|
def end_lottery_session():
|
||||||
active_lottery = get_active_lottery(g)
|
active_lottery = get_active_lottery()
|
||||||
|
|
||||||
if (active_lottery is None):
|
if (active_lottery is None):
|
||||||
return False, "There is no active lottery."
|
return False, "There is no active lottery."
|
||||||
|
|
||||||
participating_users = get_users_participating_in_lottery(g)
|
participating_users = get_users_participating_in_lottery()
|
||||||
raffle = []
|
raffle = []
|
||||||
for user in participating_users:
|
for user in participating_users:
|
||||||
for _ in range(user.currently_held_lottery_tickets):
|
for _ in range(user.currently_held_lottery_tickets):
|
||||||
raffle.append(user.id)
|
raffle.append(user.id)
|
||||||
|
|
||||||
winner = choice(raffle)
|
winner = choice(raffle)
|
||||||
|
active_lottery.winner_id = winner
|
||||||
winning_user = next(filter(lambda x: x.id == winner, participating_users))
|
winning_user = next(filter(lambda x: x.id == winner, participating_users))
|
||||||
winning_user.coins += active_lottery.prize
|
winning_user.coins += active_lottery.prize
|
||||||
winning_user.total_lottery_winnings += active_lottery.prize
|
winning_user.total_lottery_winnings += active_lottery.prize
|
||||||
|
@ -59,7 +48,7 @@ def end_lottery_session(g):
|
||||||
|
|
||||||
active_lottery.is_active = False
|
active_lottery.is_active = False
|
||||||
|
|
||||||
manager = g.db.query(User).get(MANAGER_ACCOUNT_ID)
|
manager = g.db.query(User).get(LOTTERY_MANAGER_ACCOUNT_ID)
|
||||||
manager.coins -= active_lottery.prize
|
manager.coins -= active_lottery.prize
|
||||||
|
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
|
@ -67,24 +56,25 @@ def end_lottery_session(g):
|
||||||
return True, f'{winning_user.username} won {active_lottery.prize} dramacoins!'
|
return True, f'{winning_user.username} won {active_lottery.prize} dramacoins!'
|
||||||
|
|
||||||
|
|
||||||
def start_new_lottery_session(g):
|
def start_new_lottery_session():
|
||||||
end_lottery_session(g)
|
end_lottery_session()
|
||||||
|
|
||||||
lottery = Lottery()
|
lottery = Lottery()
|
||||||
epoch_time = int(time.time())
|
epoch_time = int(time.time())
|
||||||
one_week_from_now = epoch_time + 60 * 60 * 24 * 7
|
one_week_from_now = epoch_time + 60 * 60 * 24 * 7
|
||||||
lottery.ends_at = one_week_from_now
|
lottery.ends_at = one_week_from_now
|
||||||
lottery.is_active = True
|
lottery.is_active = True
|
||||||
|
lottery.winner_id = 1
|
||||||
|
|
||||||
g.db.add(lottery)
|
g.db.add(lottery)
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
|
|
||||||
|
|
||||||
def purchase_lottery_ticket(g, v):
|
def purchase_lottery_ticket(v):
|
||||||
if (v.coins < LOTTERY_TICKET_COST):
|
if (v.coins < LOTTERY_TICKET_COST):
|
||||||
return False, f'Lottery tickets cost {LOTTERY_TICKET_COST} dramacoins each.'
|
return False, f'Lottery tickets cost {LOTTERY_TICKET_COST} dramacoins each.'
|
||||||
|
|
||||||
most_recent_lottery = get_active_lottery(g)
|
most_recent_lottery = get_active_lottery()
|
||||||
if (most_recent_lottery is None):
|
if (most_recent_lottery is None):
|
||||||
return False, "There is no active lottery."
|
return False, "There is no active lottery."
|
||||||
|
|
||||||
|
@ -92,15 +82,16 @@ def purchase_lottery_ticket(g, v):
|
||||||
v.currently_held_lottery_tickets += 1
|
v.currently_held_lottery_tickets += 1
|
||||||
v.total_held_lottery_tickets += 1
|
v.total_held_lottery_tickets += 1
|
||||||
|
|
||||||
net_ticket_value = LOTTERY_TICKET_COST - SINK_RATE - ROYALTY_RATE
|
net_ticket_value = LOTTERY_TICKET_COST - \
|
||||||
|
LOTTERY_SINK_RATE - LOTTERY_ROYALTY_RATE
|
||||||
most_recent_lottery.prize += net_ticket_value
|
most_recent_lottery.prize += net_ticket_value
|
||||||
most_recent_lottery.tickets_sold += 1
|
most_recent_lottery.tickets_sold += 1
|
||||||
|
|
||||||
manager = g.db.query(User).get(MANAGER_ACCOUNT_ID)
|
manager = g.db.query(User).get(LOTTERY_MANAGER_ACCOUNT_ID)
|
||||||
manager.coins += net_ticket_value
|
manager.coins += net_ticket_value
|
||||||
|
|
||||||
beneficiary = g.db.query(User).get(ROYALTY_ACCOUNT_ID)
|
beneficiary = g.db.query(User).get(LOTTERY_ROYALTY_ACCOUNT_ID)
|
||||||
beneficiary.coins += ROYALTY_RATE
|
beneficiary.coins += LOTTERY_ROYALTY_RATE
|
||||||
|
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
|
|
||||||
|
|
|
@ -669,6 +669,7 @@ def api_comment(v):
|
||||||
parent_post.comment_count += 1
|
parent_post.comment_count += 1
|
||||||
g.db.add(parent_post)
|
g.db.add(parent_post)
|
||||||
|
|
||||||
|
v.coins += 20000
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
|
|
||||||
if request.headers.get("Authorization"): return c.json
|
if request.headers.get("Authorization"): return c.json
|
||||||
|
|
|
@ -10,7 +10,7 @@ from files.helpers.lottery import *
|
||||||
@auth_required
|
@auth_required
|
||||||
def lottery_end(v):
|
def lottery_end(v):
|
||||||
if v.admin_level > 2:
|
if v.admin_level > 2:
|
||||||
success, message = end_lottery_session(g)
|
success, message = end_lottery_session()
|
||||||
return {"message": message} if success else {"error": message}
|
return {"message": message} if success else {"error": message}
|
||||||
else:
|
else:
|
||||||
return {"error": "JL3+ or higher required to start and end lotteries."}, 401
|
return {"error": "JL3+ or higher required to start and end lotteries."}, 401
|
||||||
|
@ -20,7 +20,7 @@ def lottery_end(v):
|
||||||
@auth_required
|
@auth_required
|
||||||
def lottery_start(v):
|
def lottery_start(v):
|
||||||
if v.admin_level > 2:
|
if v.admin_level > 2:
|
||||||
start_new_lottery_session(g)
|
start_new_lottery_session()
|
||||||
return {"message": "Lottery started."}
|
return {"message": "Lottery started."}
|
||||||
else:
|
else:
|
||||||
return {"error": "JL3+ or higher required to start and end lotteries."}, 401
|
return {"error": "JL3+ or higher required to start and end lotteries."}, 401
|
||||||
|
@ -30,8 +30,8 @@ def lottery_start(v):
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
@auth_required
|
@auth_required
|
||||||
def lottery_buy(v):
|
def lottery_buy(v):
|
||||||
success, message = purchase_lottery_ticket(g, v)
|
success, message = purchase_lottery_ticket(v)
|
||||||
lottery, participants = get_active_lottery_stats(g)
|
lottery, participants = get_active_lottery_stats()
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
return {"message": message, "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
|
return {"message": message, "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
|
||||||
|
@ -43,5 +43,6 @@ def lottery_buy(v):
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
@auth_required
|
@auth_required
|
||||||
def lottery_active(v):
|
def lottery_active(v):
|
||||||
lottery, participants = get_active_lottery_stats(g)
|
lottery, participants = get_active_lottery_stats()
|
||||||
|
|
||||||
return {"message": "", "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
|
return {"message": "", "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
|
||||||
|
|
|
@ -112,6 +112,7 @@
|
||||||
<a class="nav-link" href="/random_post/" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Random post"><i class="fas fa-random"></i></a>
|
<a class="nav-link" href="/random_post/" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Random post"><i class="fas fa-random"></i></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
{% if v %}
|
||||||
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
|
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
|
@ -123,6 +124,7 @@
|
||||||
<i class="fas fa-ticket"></i>
|
<i class="fas fa-ticket"></i>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
|
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
|
||||||
<a class="nav-link" href="/chat/" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Chat"><i class="fas fa-messages"></i></a>
|
<a class="nav-link" href="/chat/" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Chat"><i class="fas fa-messages"></i></a>
|
||||||
|
|
17
schema.sql
17
schema.sql
|
@ -1850,3 +1850,20 @@ ALTER TABLE ONLY public.votes
|
||||||
ALTER TABLE ONLY public.votes
|
ALTER TABLE ONLY public.votes
|
||||||
ADD CONSTRAINT vote_user_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);
|
ADD CONSTRAINT vote_user_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE public.lotteries (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
is_active boolean DEFAULT false NOT NULL,
|
||||||
|
ends_at integer DEFAULT 0 NOT NULL,
|
||||||
|
prize integer DEFAULT 0 NOT NULL,
|
||||||
|
tickets_sold integer DEFAULT 0 NOT NULL,
|
||||||
|
winner_id integer DEFAULT 0 NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.lotteries
|
||||||
|
ADD CONSTRAINT fk_winner FOREIGN KEY (winner_id) REFERENCES public.users(id);
|
||||||
|
|
||||||
|
ALTER TABLE public.users
|
||||||
|
ADD currently_held_lottery_tickets integer DEFAULT 0 NOT NULL,
|
||||||
|
ADD total_held_lottery_tickets integer DEFAULT 0 NOT NULL,
|
||||||
|
ADD total_lottery_winnings integer DEFAULT 0 NOT NULL;
|
Loading…
Reference in New Issue