Aevann 2024-02-11 13:31:46 +02:00
parent bcde6c9650
commit a3681d2204
4 changed files with 54 additions and 8 deletions

View File

@ -442,6 +442,10 @@ class User(Base):
if self.admin_level >= PERMS['MODS_EVERY_GROUP']: return True
return bool(g.db.query(GroupMembership.user_id).filter_by(user_id=self.id, group_name=group.name, is_mod=True).one_or_none())
@lazy
def is_member_of_group(self, group):
return bool(g.db.query(GroupMembership.user_id).filter_by(user_id=self.id, group_name=group.name).one_or_none())
@lazy
def exiler_username(self, hole):
exile = g.db.query(Exile).options(load_only(Exile.exiler_id)).filter_by(user_id=self.id, hole=hole).one_or_none()

View File

@ -266,3 +266,40 @@ def group_remove_mod(v, group_name, user_id):
send_repeatable_notification(membership.user_id, f"@{v.username} (!{group}'s owner) has removed you as a mod!")
return {"message": f'You have removed @{membership.user.username} as a mod successfully!'}
@app.post("/!<group_name>/usurp")
@limiter.limit('1/second', scope=rpath)
@limiter.limit('1/second', scope=rpath, key_func=get_ID)
@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)
@auth_required
def group_usurp(v, group_name):
group_name = group_name.strip().lower()
group = g.db.get(Group, group_name)
if not group: abort(404)
if not v.is_member_of_group(group):
abort(403, "Only members of groups can usurp them!")
search_html = f'''%src="/pp/{group.owner_id}">@%</a> (<a href="/!{group.name}" rel="nofollow">!{group.name}</a>'s owner) has % your application!</p>%'''
one_month_ago = time.time() - 2629800
is_active = g.db.query(Comment.id).filter(
Comment.author_id == AUTOJANNY_ID,
Comment.parent_post == None,
Comment.body_html.like(search_html),
Comment.created_utc > one_month_ago,
).first()
if is_active:
abort(403, f"@{group.owner.username} has reviewed a membership application in the past month, so you can't usurp them!")
send_repeatable_notification(group.owner_id, f"@{v.username} has usurped control of !{group.name} from you. This was possible because you spent more than a month not reviewing membership applications. Be active next time sweaty :!marseycheeky:")
group.owner_id = v.id
g.db.add(group)
return {"message": f'You have usurped control of !{group.name} successfully!'}

View File

@ -30,7 +30,7 @@
<th>Applied on</th>
{% endif %}
{% if v.mods_group(group) %}
{% if v.is_member_of_group(group) %}
<th class="disable-sort-click"></th>
{% endif %}
</tr>
@ -39,12 +39,12 @@
{% for membership in memberships %}
<tr id="{{membership.user_id}}">
<td id="counter-{{membership.user_id}}">{{loop.index}}</td>
{% set owner = membership.user_id == group.owner_id %}
<td {% if owner %}class="unbreakable"{% endif %}>
{% set is_owner = membership.user_id == group.owner_id %}
<td {% if is_owner %}class="unbreakable"{% endif %}>
{% with user=membership.user %}
{% include "user_in_table.html" %}
{% endwith %}
{% if owner %}
{% if is_owner %}
<img class="mx-2 group-owner" data-bs-toggle="tooltip" alt="Owner" title="Owner" src="{{SITE_FULL_IMAGES}}/e/marseykingretard.webp">
{% elif membership.is_mod %}
<img class="mx-2 group-mod" data-bs-toggle="tooltip" alt="Mod" title="Mod" src="{{SITE_FULL_IMAGES}}/e/marseyjanny.webp">
@ -57,8 +57,8 @@
<td id="time-{{membership.user_id}}" data-time="{{membership.created_utc}}"></td>
{% endif %}
{% if v.mods_group(group) %}
<td>
<td>
{% if v.mods_group(group) %}
{% if v.id == group.owner_id and v.id != membership.user_id %}
<div id="mod-{{membership.user_id}}" class="mb-2 {% if name == 'applications' %}d-none{% endif %}">
<button id="add-mod-{{membership.user_id}}" type="button" class="btn btn-success btn-block {% if membership.is_mod %}d-none{% endif %}" data-nonce="{{g.nonce}}" data-onclick="postToastSwitch(this,'/!{{group.name}}/{{membership.user_id}}/add_mod','add-mod-{{membership.user_id}}','remove-mod-{{membership.user_id}}','d-none')">Add as Mod</button>
@ -76,8 +76,12 @@
<button type="button" class="btn btn-success btn-block" data-nonce="{{g.nonce}}" data-onclick="approve_membership(this,'{{group}}','{{membership.user_id}}')">Approve</button>
<button type="button" class="btn btn-danger btn-block" data-nonce="{{g.nonce}}" data-onclick="reject_membership(this,'{{group}}','{{membership.user_id}}')">Reject</button>
</div>
</td>
{% endif %}
{% endif %}
{% if v.is_member_of_group(group) and is_owner and v.id != group.owner_id %}
<button type="button" class="btn btn-danger btn-block" data-nonce="{{g.nonce}}" data-onclick="areyousure(this)" data-areyousure="postToastReload(this,'/!{{group}}/usurp')">Usurp</button>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>

View File

@ -18,6 +18,7 @@
</div>
<p class="mt-2 mr-1" style="float: right"><b>Cost</b>: {{cost}} coins or marseybux</p>
</div>
<p class="text-danger mt-2">Warning: ping groups can get usurped from their owners if they spend more than a month not reviewing membership applications.</p>
</div>
</div>
</div>