Merge 272f3e11c1
into 3002426974
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 229 KiB |
Before Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
@ -1,38 +1,49 @@
|
|||
from sqlalchemy import *
|
||||
from dataclasses import dataclass
|
||||
|
||||
from sqlalchemy.sql.schema import Column, ForeignKey, Index
|
||||
from sqlalchemy.sql.sqltypes import Integer, String
|
||||
from sqlalchemy.orm import relationship
|
||||
from files.classes.base import Base
|
||||
from files.helpers.lazy import lazy
|
||||
from files.helpers.config.const import *
|
||||
from files.helpers.assetcache import assetcache_path
|
||||
|
||||
class BadgeDef(Base):
|
||||
__tablename__ = "badge_defs"
|
||||
__table_args__ = (
|
||||
UniqueConstraint('name', name='badge_def_name_unique'),
|
||||
)
|
||||
@dataclass(frozen=True, kw_only=True, slots=True)
|
||||
class BadgeDef:
|
||||
id: str
|
||||
name: str
|
||||
description: str
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
name = Column(String, nullable=False)
|
||||
description = Column(String)
|
||||
BADGES: list[BadgeDef] = [
|
||||
BadgeDef(
|
||||
id="unknown",
|
||||
name="Unknown Badge",
|
||||
description="Please report this if you see it! :x"
|
||||
),
|
||||
BadgeDef(
|
||||
id="verified_email",
|
||||
name="Verified Email",
|
||||
description="Verified Email"
|
||||
),
|
||||
]
|
||||
|
||||
def __repr__(self):
|
||||
return f"<{self.__class__.__name__}(id={self.id})>"
|
||||
BADGES_DICT: dict[str, BadgeDef] = {badge.id:badge for badge in BADGES}
|
||||
|
||||
class Badge(Base):
|
||||
|
||||
__tablename__ = "badges"
|
||||
|
||||
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
|
||||
badge_id = Column(Integer, ForeignKey('badge_defs.id'), primary_key=True)
|
||||
badge_id = Column(String, nullable=False)
|
||||
description = Column(String)
|
||||
url = Column(String)
|
||||
|
||||
Index('badges_badge_id_idx', badge_id)
|
||||
|
||||
user = relationship("User", viewonly=True)
|
||||
badge = relationship("BadgeDef",
|
||||
primaryjoin="foreign(Badge.badge_id) == remote(BadgeDef.id)",
|
||||
lazy="joined", innerjoin=True, viewonly=True)
|
||||
|
||||
@property
|
||||
def badge(self) -> BadgeDef:
|
||||
return BADGES_DICT.get(self.badge_id, BADGES_DICT['unknown'])
|
||||
|
||||
def __repr__(self):
|
||||
return f"<{self.__class__.__name__}(user_id={self.user_id}, badge_id={self.badge_id})>"
|
||||
|
|
|
@ -76,8 +76,8 @@ def activate(v):
|
|||
user.email = email
|
||||
user.is_activated = True
|
||||
|
||||
if not any(b.badge_id == 2 for b in user.badges):
|
||||
mail_badge = Badge(user_id=user.id, badge_id=2)
|
||||
if not user.has_badge("verified_email"):
|
||||
mail_badge = Badge(user_id=user.id, badge_id="verified_email")
|
||||
g.db.add(mail_badge)
|
||||
g.db.flush()
|
||||
send_notification(user.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{mail_badge.name}")
|
||||
|
|
|
@ -54,32 +54,6 @@ def buy(v, award):
|
|||
if v.coins < price: abort(400, "Not enough coins.")
|
||||
v.coins -= price
|
||||
v.coins_spent += price
|
||||
if v.coins_spent >= 1000000 and not v.has_badge(73):
|
||||
new_badge = Badge(badge_id=73, user_id=v.id)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(v.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
elif v.coins_spent >= 500000 and not v.has_badge(72):
|
||||
new_badge = Badge(badge_id=72, user_id=v.id)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(v.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
elif v.coins_spent >= 250000 and not v.has_badge(71):
|
||||
|
||||
new_badge = Badge(badge_id=71, user_id=v.id)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(v.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
elif v.coins_spent >= 100000 and not v.has_badge(70):
|
||||
new_badge = Badge(badge_id=70, user_id=v.id)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(v.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
elif v.coins_spent >= 10000 and not v.has_badge(69):
|
||||
new_badge = Badge(badge_id=69, user_id=v.id)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(v.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
g.db.add(v)
|
||||
|
||||
|
||||
|
|
|
@ -321,26 +321,6 @@ def sign_up_post(v):
|
|||
g.db.add(new_user)
|
||||
g.db.flush()
|
||||
|
||||
if ref_id:
|
||||
ref_user = g.db.query(User).filter_by(id=ref_id).one_or_none()
|
||||
|
||||
if ref_user:
|
||||
if ref_user.referral_count and not ref_user.has_badge(10):
|
||||
new_badge = Badge(user_id=ref_user.id, badge_id=10)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(ref_user.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
if ref_user.referral_count >= 10 and not ref_user.has_badge(11):
|
||||
new_badge = Badge(user_id=ref_user.id, badge_id=11)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(ref_user.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
if ref_user.referral_count >= 100 and not ref_user.has_badge(12):
|
||||
new_badge = Badge(user_id=ref_user.id, badge_id=12)
|
||||
g.db.add(new_badge)
|
||||
g.db.flush()
|
||||
send_notification(ref_user.id, f"@AutoJanny has given you the following profile badge:\n\n\n\n{new_badge.name}")
|
||||
|
||||
check_for_alts(new_user.id)
|
||||
|
||||
if email: send_verification_email(new_user)
|
||||
|
|