forked from rDrama/rDrama
add namelock award
parent
fb4f02a80b
commit
864f770762
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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":
|
||||
|
|
|
@ -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())
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
Loading…
Reference in New Issue