add namelock award

pull/148/head
Aevann 2023-05-13 07:53:14 +03:00
parent fb4f02a80b
commit 864f770762
17 changed files with 82 additions and 10 deletions

View File

@ -95,3 +95,7 @@ pre {
h5.post-title a:visited {
color: #7a7a7a !important;
}
[disabled], .disabled, button[disabled], .btn[disabled], button.disabled, .btn.disabled {
color: #bbb !important;
}

View File

@ -205,6 +205,7 @@
.fa-lock-open:before{content:"\f3c1"}
.fa-down:before{content:"\f354"}
.fa-shield-virus:before{content:"\e06c"}
.fa-at:before{content:"\40"}
button {
background: none;

View File

@ -64,3 +64,7 @@ h5.post-title a:visited {
.modal-content {
border: 1px var(--gray-500) solid;
}
[disabled], .disabled, button[disabled], .btn[disabled], button.disabled, .btn.disabled {
color: #bbb !important;
}

View File

@ -133,6 +133,11 @@ function pick(kind, price, coins, marseybux) {
document.getElementById('note').placeholder = "Insert new flair here, or leave empty to add 1 day to the duration of the current flair. 100 characters max.";
document.getElementById('note').maxLength = 100;
}
else if (kind == "namelock") {
document.getElementById('notelabel').innerHTML = "New username:";
document.getElementById('note').placeholder = "Insert new username here, or leave empty to add 1 day to the duration of the current username. 25 characters max.";
document.getElementById('note').maxLength = 25;
}
else {
document.getElementById('notelabel').innerHTML = "Note (optional):";
document.getElementById('note').placeholder = "Note to include in award notification";

View File

@ -0,0 +1,4 @@
const namechanged = document.getElementById('namechanged').value
const namedate = formatDate(new Date(namechanged*1000));
const nametext = ` - Your username has been locked until ${namedate}`;
document.getElementById('name-body').value += nametext;

View File

@ -105,6 +105,7 @@ class User(Base):
slurreplacer = Column(Integer, default=1)
profanityreplacer = Column(Integer, default=1)
flairchanged = Column(Integer, default=0)
namechanged = Column(Integer, default=0)
newtab = Column(Boolean, default=False)
newtabexternal = Column(Boolean, default=True)
reddit = Column(String, default='old.reddit.com')
@ -140,6 +141,7 @@ class User(Base):
defaulttime = Column(String, default=DEFAULT_TIME_FILTER)
custom_filter_list = Column(String)
original_username = Column(String)
prelock_username = Column(String)
referred_by = Column(Integer, ForeignKey("users.id"))
currently_held_lottery_tickets = Column(Integer, default=0)
total_held_lottery_tickets = Column(Integer, default=0)

View File

@ -507,6 +507,18 @@ AWARDS = {
"ghost": False,
"enabled": True,
},
"namelock": {
"kind": "namelock",
"title": "1-Day Namelock",
"description": "Changes the user's username to something of your choosing for 24 hours.",
"icon": "fas fa-at",
"color": "text-pink",
"price": 1000,
"deflectable": True,
"cosmetic": False,
"ghost": False,
"enabled": True,
},
"agendaposter": {
"kind": "agendaposter",
"title": "Chud",
@ -704,7 +716,7 @@ AWARDS = {
"title": "Fish",
"description": "This user cannot be unfollowed",
"icon": "fas fa-fish",
"color": "text-lightblue",
"color": "text-gold",
"price": 20000,
"deflectable": True,
"cosmetic": False,

View File

@ -242,3 +242,7 @@ def _award_timers_task():
User.chudded_by: None,
})
_process_timer(User.flairchanged, [96], "Your temporary flair-lock has expired. You can now change your flair!")
_process_timer(User.namechanged, [], "Your temporary name-lock has expired. You're now back to your old username!", {
User.username: User.prelock_username,
User.prelock_username: None,
})

View File

@ -22,7 +22,8 @@ def get_id(username:str, graceful=False) -> Optional[int]:
).filter(
or_(
User.username.ilike(username),
User.original_username.ilike(username)
User.original_username.ilike(username),
User.prelock_username.ilike(username),
)
).one_or_none()
@ -46,7 +47,8 @@ def get_user(username:Optional[str], v:Optional[User]=None, graceful=False, incl
).filter(
or_(
User.username.ilike(username),
User.original_username.ilike(username)
User.original_username.ilike(username),
User.prelock_username.ilike(username),
)
)
@ -75,7 +77,8 @@ def get_users(usernames:Iterable[str], ids_only=False, graceful=False) -> List[U
users = users.filter(
or_(
User.username.ilike(any_(usernames)),
User.original_username.ilike(any_(usernames))
User.original_username.ilike(any_(usernames)),
User.prelock_username.ilike(any_(usernames)),
)
).all()

View File

@ -381,6 +381,8 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_emojis=
users_dict[u.username.lower()] = u
if u.original_username:
users_dict[u.original_username.lower()] = u
if u.prelock_username:
users_dict[u.prelock_username.lower()] = u
def replacer(m):
u = users_dict.get(m.group(1).lower())

View File

@ -903,7 +903,8 @@ def admin_title_change(user_id, v):
user=get_account(user.id)
user.customtitle=new_name
if request.values.get("locked"): user.flairchanged = int(time.time()) + 2629746
if request.values.get("locked"):
user.flairchanged = int(time.time()) + 2629746
else:
user.flairchanged = 0
badge = user.has_badge(96)

View File

@ -348,6 +348,17 @@ def award_thing(v, thing_type, id):
author.customtitle = new_name
author.flairchanged = int(time.time()) + 86400
badge_grant(user=author, badge_id=96)
elif kind == "namelock":
new_name = note.strip()
if not valid_username_regex.fullmatch(new_name):
abort(400, "Invalid username")
if not new_name and author.prelock_username:
author.namechanged += 86400
else:
author.prelock_username = author.username
author.username = new_name
author.namechanged = int(time.time()) + 86400
elif kind == "pause":
badge_grant(badge_id=68, user=author)
elif kind == "unpausable":

View File

@ -397,7 +397,8 @@ def searchusers(v:User):
users = users.filter(
or_(
User.username.ilike(f'%{term}%'),
User.original_username.ilike(f'%{term}%')
User.original_username.ilike(f'%{term}%'),
User.prelock_username.ilike(f'%{term}%'),
)
).order_by(User.username.ilike(term).desc(), User.stored_subscriber_count.desc())

View File

@ -572,6 +572,7 @@ def settings_images_profile(v):
cache.delete_memoized(get_profile_picture, v.id)
cache.delete_memoized(get_profile_picture, v.username)
cache.delete_memoized(get_profile_picture, v.original_username)
cache.delete_memoized(get_profile_picture, v.prelock_username)
return redirect("/settings/personal?msg=Profile picture successfully updated!")
@ -720,6 +721,8 @@ def settings_advanced_get(v:User):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@is_not_permabanned
def settings_name_change(v):
if v.namechanged: abort(403)
new_name=request.values.get("name").strip()
if new_name==v.username:
@ -737,7 +740,8 @@ def settings_name_change(v):
x = g.db.query(User).filter(
or_(
User.username.ilike(search_name),
User.original_username.ilike(search_name)
User.original_username.ilike(search_name),
User.prelock_username.ilike(search_name),
)
).one_or_none()

View File

@ -715,7 +715,8 @@ def is_available(name:str):
x = g.db.query(User).filter(
or_(
User.username.ilike(name2),
User.original_username.ilike(name2)
User.original_username.ilike(name2),
User.prelock_username.ilike(name2),
)
).one_or_none()

View File

@ -163,10 +163,10 @@
<p>Your original username will always stay reserved for you: <code>{{v.original_username}}</code></p>
<form action="/settings/name_change" method="post">
<input hidden name="formkey" value="{{v|formkey}}">
<input autocomplete="off" type="text" name="name" class="form-control" value="{{v.username}}">
<input id="name-body" autocomplete="off" type="text" name="name" class="form-control" value="{{v.username}}" {% if v.namechanged %}disabled{% endif %}>
<small>3-25 characters, including letters, numbers, _ , and -</small>
<div class="d-flex mt-2">
<input autocomplete="off" class="btn btn-primary ml-auto" type="submit" value="Change Display Name">
<input autocomplete="off" class="btn btn-primary ml-auto" type="submit" value="Change Display Name" {% if v.namechanged %}disabled{% endif %}>
</div>
</form>
</div>
@ -268,6 +268,12 @@
{% if v.flairchanged %}
<input hidden id="flairchanged" value="{{v.flairchanged}}">
<script defer src="{{'js/flairchanged.js' | asset}}"></script>
{% endif %}
{% if v.namechanged %}
<input hidden id="namechanged" value="{{v.namechanged}}">
<script defer src="{{'js/namechanged.js' | asset}}"></script>
{% endif %}
<script defer src="{{'js/settings_profile.js' | asset}}"></script>

View File

@ -0,0 +1,7 @@
alter table users add column prelock_username varchar(30) unique;
alter table users add column namechanged integer;
create unique index lowercase_prelock_username on users using btree (lower((prelock_username)::text));
create index users_prelock_username_trgm_idx on users using gin (prelock_username gin_trgm_ops);