mirror of https://gitlab.com/litecord/litecord.git
enable use of invites pointing to group dms
(in theory) - dm_channels: add gdm_is_member
This commit is contained in:
parent
7bde2dd7a1
commit
8e6564dd7d
|
|
@ -161,6 +161,17 @@ async def gdm_destroy(channel_id):
|
||||||
await app.dispatcher.remove('channel', channel_id)
|
await app.dispatcher.remove('channel', channel_id)
|
||||||
|
|
||||||
|
|
||||||
|
async def gdm_is_member(channel_id: int, user_id: int) -> bool:
|
||||||
|
"""Return if the given user is a member of the Group DM."""
|
||||||
|
row = await app.db.fetchval("""
|
||||||
|
SELECT id
|
||||||
|
FROM group_dm_members
|
||||||
|
WHERE id = $1 AND member_id = $2
|
||||||
|
""", channel_id, user_id)
|
||||||
|
|
||||||
|
return row is not None
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/<int:dm_chan>/recipients/<int:peer_id>', methods=['PUT'])
|
@bp.route('/<int:dm_chan>/recipients/<int:peer_id>', methods=['PUT'])
|
||||||
async def add_to_group_dm(dm_chan, peer_id):
|
async def add_to_group_dm(dm_chan, peer_id):
|
||||||
"""Adds a member to a group dm OR creates a group dm."""
|
"""Adds a member to a group dm OR creates a group dm."""
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ from litecord.blueprints.checks import (
|
||||||
channel_check, channel_perm_check, guild_check, guild_perm_check
|
channel_check, channel_perm_check, guild_check, guild_perm_check
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from litecord.blueprints.dm_channels import gdm_is_member, gdm_add_recipient
|
||||||
|
|
||||||
log = Logger(__name__)
|
log = Logger(__name__)
|
||||||
bp = Blueprint('invites', __name__)
|
bp = Blueprint('invites', __name__)
|
||||||
|
|
||||||
|
|
@ -80,33 +82,41 @@ async def invite_precheck(user_id: int, guild_id: int):
|
||||||
raise InvalidInvite('You are banned.')
|
raise InvalidInvite('You are banned.')
|
||||||
|
|
||||||
|
|
||||||
async def use_invite(user_id, invite_code):
|
async def invite_precheck_gdm(user_id: int, channel_id: int):
|
||||||
"""Try using an invite"""
|
"""pre-checks in a group dm."""
|
||||||
inv = await app.db.fetchrow("""
|
is_member = await gdm_is_member(channel_id, user_id)
|
||||||
SELECT guild_id, created_at, max_age, uses, max_uses
|
|
||||||
FROM invites
|
|
||||||
WHERE code = $1
|
|
||||||
""", invite_code)
|
|
||||||
|
|
||||||
if inv is None:
|
if is_member:
|
||||||
raise UnknownInvite('Unknown invite')
|
raise BadRequest('You are already in the Group DM')
|
||||||
|
|
||||||
if inv['max_age'] is not 0:
|
|
||||||
now = datetime.datetime.utcnow()
|
|
||||||
delta_sec = (now - inv['created_at']).total_seconds()
|
|
||||||
|
|
||||||
if delta_sec > inv['max_age']:
|
async def _inv_check_age(inv: dict):
|
||||||
await delete_invite(invite_code)
|
if inv['max_age'] is 0:
|
||||||
raise InvalidInvite('Invite is expired')
|
return
|
||||||
|
|
||||||
if inv['max_uses'] is not -1 and inv['uses'] > inv['max_uses']:
|
now = datetime.datetime.utcnow()
|
||||||
await delete_invite(invite_code)
|
delta_sec = (now - inv['created_at']).total_seconds()
|
||||||
raise InvalidInvite('Too many uses')
|
|
||||||
|
|
||||||
# TODO: if group dm invite, guild_id is null.
|
if delta_sec > inv['max_age']:
|
||||||
guild_id = inv['guild_id']
|
await delete_invite(inv['code'])
|
||||||
await invite_precheck(user_id, guild_id)
|
raise InvalidInvite('Invite is expired')
|
||||||
|
|
||||||
|
if inv['max_uses'] is not -1 and inv['uses'] > inv['max_uses']:
|
||||||
|
await delete_invite(inv['code'])
|
||||||
|
raise InvalidInvite('Too many uses')
|
||||||
|
|
||||||
|
|
||||||
|
async def _guild_add_member(guild_id: int, user_id: int):
|
||||||
|
"""Add a user to a guild.
|
||||||
|
|
||||||
|
Dispatches:
|
||||||
|
- GUILD_MEMBER_ADD to all members.
|
||||||
|
- lazy guild events for member add.
|
||||||
|
- subscribes the peer to the guild.
|
||||||
|
- dispatches a GUILD_CREATE to the peer.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# TODO: system message for member join
|
||||||
await app.db.execute("""
|
await app.db.execute("""
|
||||||
INSERT INTO members (user_id, guild_id)
|
INSERT INTO members (user_id, guild_id)
|
||||||
VALUES ($1, $2)
|
VALUES ($1, $2)
|
||||||
|
|
@ -120,12 +130,6 @@ async def use_invite(user_id, invite_code):
|
||||||
VALUES ($1, $2, $3)
|
VALUES ($1, $2, $3)
|
||||||
""", user_id, guild_id, guild_id)
|
""", user_id, guild_id, guild_id)
|
||||||
|
|
||||||
await app.db.execute("""
|
|
||||||
UPDATE invites
|
|
||||||
SET uses = uses + 1
|
|
||||||
WHERE code = $1
|
|
||||||
""", invite_code)
|
|
||||||
|
|
||||||
# tell current members a new member came up
|
# tell current members a new member came up
|
||||||
member = await app.storage.get_member_data_one(guild_id, user_id)
|
member = await app.storage.get_member_data_one(guild_id, user_id)
|
||||||
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_MEMBER_ADD', {
|
await app.dispatcher.dispatch_guild(guild_id, 'GUILD_MEMBER_ADD', {
|
||||||
|
|
@ -150,6 +154,38 @@ async def use_invite(user_id, invite_code):
|
||||||
user_id, guild_id, 'GUILD_CREATE', guild)
|
user_id, guild_id, 'GUILD_CREATE', guild)
|
||||||
|
|
||||||
|
|
||||||
|
async def use_invite(user_id, invite_code):
|
||||||
|
"""Try using an invite"""
|
||||||
|
inv = await app.db.fetchrow("""
|
||||||
|
SELECT code, channel_id, guild_id, created_at,
|
||||||
|
max_age, uses, max_uses
|
||||||
|
FROM invites
|
||||||
|
WHERE code = $1
|
||||||
|
""", invite_code)
|
||||||
|
|
||||||
|
if inv is None:
|
||||||
|
raise UnknownInvite('Unknown invite')
|
||||||
|
|
||||||
|
await _inv_check_age(inv)
|
||||||
|
|
||||||
|
# NOTE: if group dm invite, guild_id is null.
|
||||||
|
guild_id = inv['guild_id']
|
||||||
|
|
||||||
|
if guild_id is None:
|
||||||
|
channel_id = inv['channel_id']
|
||||||
|
await invite_precheck_gdm(user_id, inv['channel_id'])
|
||||||
|
await gdm_add_recipient(channel_id, user_id)
|
||||||
|
else:
|
||||||
|
await invite_precheck(user_id, guild_id)
|
||||||
|
await _guild_add_member(guild_id, user_id)
|
||||||
|
|
||||||
|
await app.db.execute("""
|
||||||
|
UPDATE invites
|
||||||
|
SET uses = uses + 1
|
||||||
|
WHERE code = $1
|
||||||
|
""", invite_code)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/channels/<int:channel_id>/invites', methods=['POST'])
|
@bp.route('/channels/<int:channel_id>/invites', methods=['POST'])
|
||||||
async def create_invite(channel_id):
|
async def create_invite(channel_id):
|
||||||
"""Create an invite to a channel."""
|
"""Create an invite to a channel."""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue