Skip to content

Commit

Permalink
add requirement for VIEW_CHANNEL for some gw events
Browse files Browse the repository at this point in the history
  • Loading branch information
RuslanUC committed Feb 20, 2024
1 parent 6be9bf2 commit c46139d
Showing 6 changed files with 32 additions and 18 deletions.
20 changes: 13 additions & 7 deletions yepcord/rest_api/routes/channels.py
Original file line number Diff line number Diff line change
@@ -212,7 +212,8 @@ async def delete_message(user: User, channel: Channel, message: Message):
raise InvalidDataErr(403, Errors.make(50003))
guild_id = channel.guild.id if channel.guild else None
await message.delete()
await getGw().dispatch(MessageDeleteEvent(message.id, channel.id, guild_id), channel=channel)
await getGw().dispatch(MessageDeleteEvent(message.id, channel.id, guild_id), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return "", 204


@@ -226,7 +227,8 @@ async def edit_message(data: MessageUpdate, user: User, channel: Channel, messag
await member.checkPermission(GuildPermissions.SEND_MESSAGES, GuildPermissions.VIEW_CHANNEL,
GuildPermissions.READ_MESSAGE_HISTORY, channel=channel)
await message.update(**data.to_json(), edit_timestamp=datetime.now())
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=channel)
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return await message.ds_json()


@@ -269,7 +271,7 @@ async def send_typing_event(user: User, channel: Channel):
if channel.guild:
member = await getCore().getGuildMember(channel.guild, user.id)
await member.checkPermission(GuildPermissions.VIEW_CHANNEL, channel=channel)
await getGw().dispatch(TypingEvent(user.id, channel.id), channel=channel)
await getGw().dispatch(TypingEvent(user.id, channel.id), channel=channel, permissions=GuildPermissions.VIEW_CHANNEL)
return "", 204


@@ -341,7 +343,8 @@ async def pin_message(user: User, channel: Channel, message: Message):
)

await getCore().sendMessage(msg)
await getGw().dispatch(MessageCreateEvent(await msg.ds_json()), channel=msg.channel)
await getGw().dispatch(MessageCreateEvent(await msg.ds_json()), channel=msg.channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return "", 204


@@ -384,7 +387,8 @@ async def add_message_reaction(user: User, channel: Channel, message: Message, r
"emoji_name": reaction if isinstance(reaction, str) else reaction.name
}
await getCore().addReaction(message, user, **emoji)
await getGw().dispatch(MessageReactionAddEvent(user.id, message.id, channel.id, emoji), channel=channel)
await getGw().dispatch(MessageReactionAddEvent(user.id, message.id, channel.id, emoji), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return "", 204


@@ -402,7 +406,8 @@ async def remove_message_reaction(user: User, channel: Channel, message: Message
"emoji_name": reaction if isinstance(reaction, str) else reaction.name
}
await getCore().removeReaction(message, user, **emoji)
await getGw().dispatch(MessageReactionRemoveEvent(user.id, message.id, channel.id, emoji), channel=channel)
await getGw().dispatch(MessageReactionRemoveEvent(user.id, message.id, channel.id, emoji), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return "", 204


@@ -571,7 +576,8 @@ async def create_thread(data: CreateThread, user: User, channel: Channel, messag
guild_id=channel.guild.id)
await getGw().dispatch(ThreadMemberUpdateEvent(thread_member.ds_json()), guild_id=channel.guild.id)
await message.update(thread=thread, flags=message.flags | MessageFlags.HAS_THREAD)
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=message.channel)
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=message.channel,
permissions=GuildPermissions.VIEW_CHANNEL)
await getCore().sendMessage(thread_message)
await getCore().sendMessage(thread_create_message)

6 changes: 4 additions & 2 deletions yepcord/rest_api/routes/guilds.py
Original file line number Diff line number Diff line change
@@ -366,9 +366,11 @@ async def ban_member(data: BanMember, user: User, guild: Guild, member: GuildMem
deleted_messages = await getCore().bulkDeleteGuildMessagesFromBanned(guild, user_id, after)
for channel, messages in deleted_messages.items():
if len(messages) > 1:
await getGw().dispatch(MessageBulkDeleteEvent(guild.id, channel.id, messages))
await getGw().dispatch(MessageBulkDeleteEvent(guild.id, channel.id, messages), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)
elif len(messages) == 1:
await getGw().dispatch(MessageDeleteEvent(messages[0], channel.id, guild.id), channel=channel)
await getGw().dispatch(MessageDeleteEvent(messages[0], channel.id, guild.id), channel=channel,
permissions=GuildPermissions.VIEW_CHANNEL)

if target_member is not None:
entry = await AuditLogEntry.utils.member_ban(user, target_member, reason)
3 changes: 2 additions & 1 deletion yepcord/rest_api/routes/invites.py
Original file line number Diff line number Diff line change
@@ -90,7 +90,8 @@ async def use_invite(user: User, invite: Invite):
guild=guild
)
await getCore().sendMessage(message)
await getGw().dispatch(MessageCreateEvent(await message.ds_json()), channel=sys_channel)
await getGw().dispatch(MessageCreateEvent(await message.ds_json()), channel=sys_channel,
permissions=GuildPermissions.VIEW_CHANNEL)
await getCore().useInvite(invite)
await getGw().dispatchSub([user.id], guild_id=guild.id)
return inv
6 changes: 3 additions & 3 deletions yepcord/rest_api/routes/oauth2.py
Original file line number Diff line number Diff line change
@@ -133,14 +133,14 @@ async def authorize_application(query_args: AppAuthorizePostQs, data: AppAuthori
permissions=GuildPermissions.VIEW_AUDIT_LOG)

await getGw().dispatch(GuildCreateEvent(await guild.ds_json(user_id=bot.user.id)), user_ids=[bot.user.id])
if guild.system_channel:
sys_channel = await getCore().getChannel(guild.system_channel)
if (sys_channel := await getCore().getChannel(guild.system_channel)) is not None:
message = await Message.create(
id=Snowflake.makeId(), author=bot.user, channel=sys_channel, content="", type=MessageType.USER_JOIN,
guild=guild
)
await getCore().sendMessage(message)
await getGw().dispatch(MessageCreateEvent(await message.ds_json()), channel=sys_channel)
await getGw().dispatch(MessageCreateEvent(await message.ds_json()), channel=sys_channel,
permissions=GuildPermissions.VIEW_CHANNEL)

return {"location": f"https://{Config.PUBLIC_HOST}/oauth2/authorized"}

11 changes: 7 additions & 4 deletions yepcord/rest_api/routes/webhooks.py
Original file line number Diff line number Diff line change
@@ -118,7 +118,7 @@ async def post_webhook_message(query_args: WebhookMessageCreateQuery, webhook: i

message_json = await message.ds_json()
await getCore().sendMessage(message)
await getGw().dispatch(MessageCreateEvent(message_json), channel=channel)
await getGw().dispatch(MessageCreateEvent(message_json), channel=channel, permissions=GuildPermissions.VIEW_CHANNEL)

if query_args.wait:
return message_json
@@ -145,7 +145,8 @@ async def delete_webhook_message(webhook: Webhook, message: Message):
@multipleDecorators(validate_request(MessageUpdate), getWebhook, getMessage)
async def edit_webhook_message(data: MessageUpdate, webhook: Webhook, message: Message):
await message.update(**data.to_json(), edit_timestamp=datetime.now())
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=webhook.channel)
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=webhook.channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return await message.ds_json()


@@ -171,7 +172,8 @@ async def interaction_followup_create(interaction: Interaction, message: Message
await getGw().dispatch(MessageUpdateEvent(message_obj),
user_ids=[interaction.user.id, interaction.application.id])
else:
await getGw().dispatch(MessageUpdateEvent(message_obj), channel=interaction.channel)
await getGw().dispatch(MessageUpdateEvent(message_obj), channel=interaction.channel,
permissions=GuildPermissions.VIEW_CHANNEL)

return message_obj

@@ -195,5 +197,6 @@ async def delete_interaction_message(interaction: Interaction, message: Message)
@multipleDecorators(validate_request(MessageUpdate), getInteractionW)
async def edit_interaction_message(data: MessageUpdate, interaction: Interaction, message: Message):
await message.update(**data.to_json(), edit_timestamp=datetime.now())
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=interaction.channel)
await getGw().dispatch(MessageUpdateEvent(await message.ds_json()), channel=interaction.channel,
permissions=GuildPermissions.VIEW_CHANNEL)
return await message.ds_json()
4 changes: 3 additions & 1 deletion yepcord/yepcord/core.py
Original file line number Diff line number Diff line change
@@ -265,7 +265,9 @@ async def useMfaCode(self, user: User, code: str) -> bool:
await code.save(update_fields=["used"])
return True

async def getChannel(self, channel_id: int) -> Optional[Channel]:
async def getChannel(self, channel_id: Optional[int]) -> Optional[Channel]:
if channel_id is None:
return None
if (channel := await Channel.get_or_none(id=channel_id).select_related("guild", "owner", "parent")) is None:
return
return await self.setLastMessageIdForChannel(channel)

0 comments on commit c46139d

Please sign in to comment.