Merge branch '1.0.1' into #270

This commit is contained in:
Sven Heidemann 2023-03-28 23:30:32 +02:00
commit d818eafb9d
18 changed files with 97 additions and 35 deletions

View File

@ -2,9 +2,11 @@ from abc import ABC, abstractmethod
from datetime import datetime from datetime import datetime
from typing import Callable from typing import Callable
import discord
from cpl_query.extension import List from cpl_query.extension import List
from discord.ext.commands import Context from discord.ext.commands import Context
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.user import User from bot_data.model.user import User
from modules.base.configuration.base_server_settings import BaseServerSettings from modules.base.configuration.base_server_settings import BaseServerSettings
@ -59,3 +61,9 @@ class ClientUtilsABC(ABC):
@abstractmethod @abstractmethod
def get_ontime_for_user(self, user: User) -> float: def get_ontime_for_user(self, user: User) -> float:
pass pass
@abstractmethod
async def react_to_message_by_auto_role_rule(
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
):
pass

View File

@ -9,6 +9,7 @@ from cpl_core.time import TimeFormatSettings
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List from cpl_query.extension import List
from cpl_translation import TranslatePipe from cpl_translation import TranslatePipe
from discord import Guild
from discord.ext.commands import Context from discord.ext.commands import Context
from bot_core.abc.client_utils_abc import ClientUtilsABC from bot_core.abc.client_utils_abc import ClientUtilsABC
@ -23,6 +24,7 @@ from bot_data.abc.user_joined_voice_channel_repository_abc import (
from bot_data.abc.user_message_count_per_hour_repository_abc import ( from bot_data.abc.user_message_count_per_hour_repository_abc import (
UserMessageCountPerHourRepositoryABC, UserMessageCountPerHourRepositoryABC,
) )
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.user import User from bot_data.model.user import User
from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour
from modules.base.configuration.base_server_settings import BaseServerSettings from modules.base.configuration.base_server_settings import BaseServerSettings
@ -192,3 +194,27 @@ class ClientUtilsService(ClientUtilsABC):
.sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600), .sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600),
2, 2,
) )
async def react_to_message_by_auto_role_rule(
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
):
try:
guild: Guild = self._bot.guilds.where(lambda g: g == guild).single()
channel = guild.get_channel(discord_channel_id)
message = await channel.fetch_message(discord_message_id)
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
if emoji is None:
self._logger.debug(__name__, f"Emoji {rule.emoji_name} not found")
return
await message.add_reaction(emoji)
self._logger.debug(
__name__,
f"Added reaction {rule.emoji_name} to message: {discord_message_id}",
)
except Exception as e:
self._logger.error(
__name__,
f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}",
e,
)

View File

@ -135,7 +135,7 @@ class QueryABC(ObjectType):
u: User = u u: User = u
guild = bot.get_guild(u.server.discord_id) guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id) member = guild.get_member(u.discord_id)
if u.id == element.id or permissions.is_member_moderator(member): if u.id == element.user.id or permissions.is_member_moderator(member):
access = True access = True
break break
@ -144,7 +144,7 @@ class QueryABC(ObjectType):
u: User = u u: User = u
guild = bot.get_guild(u.server.discord_id) guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id) member = guild.get_member(u.discord_id)
if u.id == element.id or permissions.is_member_moderator(member): if u.id == element.user.id or permissions.is_member_moderator(member):
access = True access = True
break break
@ -153,7 +153,7 @@ class QueryABC(ObjectType):
u: User = u u: User = u
guild = bot.get_guild(u.server.discord_id) guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id) member = guild.get_member(u.discord_id)
if u.id == element.id or permissions.is_member_moderator(member): if u.id == element.user.id or permissions.is_member_moderator(member):
access = True access = True
break break

View File

@ -1,5 +1,7 @@
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.auto_role_rule import AutoRoleRule from bot_data.model.auto_role_rule import AutoRoleRule
@ -10,15 +12,19 @@ from bot_graphql.abc.query_abc import QueryABC
class AutoRoleRuleMutation(QueryABC): class AutoRoleRuleMutation(QueryABC):
def __init__( def __init__(
self, self,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC, servers: ServerRepositoryABC,
auto_roles: AutoRoleRepositoryABC, auto_roles: AutoRoleRepositoryABC,
db: DatabaseContextABC, db: DatabaseContextABC,
client_utils: ClientUtilsABC,
): ):
QueryABC.__init__(self, "AutoRoleRuleMutation") QueryABC.__init__(self, "AutoRoleRuleMutation")
self._bot = bot
self._servers = servers self._servers = servers
self._auto_roles = auto_roles self._auto_roles = auto_roles
self._db = db self._db = db
self._client_utils = client_utils
self.set_field("createAutoRoleRule", self.resolve_create_auto_role_rule) self.set_field("createAutoRoleRule", self.resolve_create_auto_role_rule)
self.set_field("updateAutoRoleRule", self.resolve_update_auto_role_rule) self.set_field("updateAutoRoleRule", self.resolve_update_auto_role_rule)
@ -40,6 +46,14 @@ class AutoRoleRuleMutation(QueryABC):
and x.role_id == int(input["roleId"]) and x.role_id == int(input["roleId"])
) )
self._bot.loop.create_task(
self._client_utils.react_to_message_by_auto_role_rule(
auto_role_rule.auto_role.discord_channel_id,
auto_role_rule.auto_role.discord_message_id,
auto_role_rule,
self._bot.get_guild(auto_role_rule.auto_role.server.discord_id),
)
)
return self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role_rule.auto_role.id).where(get_new).last() return self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role_rule.auto_role.id).where(get_new).last()
def resolve_update_auto_role_rule(self, *_, input: dict): def resolve_update_auto_role_rule(self, *_, input: dict):
@ -53,6 +67,14 @@ class AutoRoleRuleMutation(QueryABC):
self._db.save_changes() self._db.save_changes()
auto_role_rule = self._auto_roles.get_auto_role_rule_by_id(input["id"]) auto_role_rule = self._auto_roles.get_auto_role_rule_by_id(input["id"])
self._bot.loop.create_task(
self._client_utils.react_to_message_by_auto_role_rule(
auto_role_rule.auto_role.discord_channel_id,
auto_role_rule.auto_role.discord_message_id,
auto_role_rule,
self._bot.get_guild(auto_role_rule.auto_role.server.discord_id),
)
)
return auto_role_rule return auto_role_rule
def resolve_delete_auto_role_rule(self, *_, id: int): def resolve_delete_auto_role_rule(self, *_, id: int):

View File

@ -6,7 +6,7 @@ from cpl_discord.command import DiscordCommandABC
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List from cpl_query.extension import List
from cpl_translation import TranslatePipe from cpl_translation import TranslatePipe
from discord import app_commands, Guild from discord import app_commands
from discord.ext import commands from discord.ext import commands
from discord.ext.commands import Context from discord.ext.commands import Context
@ -312,25 +312,12 @@ class AutoRoleGroup(DiscordCommandABC):
.where(lambda r: r.emoji_name == emoji.name and int(role_id) == role.id) .where(lambda r: r.emoji_name == emoji.name and int(role_id) == role.id)
.single() .single()
) )
try:
guild: Guild = self._bot.guilds.where(lambda g: g == ctx.guild).single()
channel = guild.get_channel(auto_role_from_db.discord_channel_id)
message = await channel.fetch_message(auto_role_from_db.discord_message_id)
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
if emoji is None: # as task to run in background
self._logger.debug(__name__, f"Emoji {rule.emoji_name} not found") self._bot.loop.create_task(
return await self._client_utils.react_to_message_by_auto_role_rule(
await message.add_reaction(emoji) auto_role_from_db.discord_channel_id, auto_role_from_db.discord_message_id, rule, ctx.guild
self._logger.debug(
__name__,
f"Added reaction {rule.emoji_name} to message: {auto_role_from_db.discord_message_id}",
) )
except Exception as e:
self._logger.error(
__name__,
f"Cannot add reaction {rule.emoji_name} to message: {auto_role_from_db.discord_message_id}",
e,
) )
await self._message_service.send_ctx_msg( await self._message_service.send_ctx_msg(

View File

@ -32,9 +32,9 @@ class AutoRoleReactionHandler:
return return
guild = self._bot.get_guild(payload.guild_id) guild = self._bot.get_guild(payload.guild_id)
user = guild.get_member(payload.user_id) user = guild.get_member(payload.id)
if user is None: if user is None:
self._logger.warn(__name__, f"User {payload.user_id} in {guild.name} not found - skipping") self._logger.warn(__name__, f"User {payload.id} in {guild.name} not found - skipping")
return return
if user.bot: if user.bot:

View File

@ -102,6 +102,9 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
server = self._servers.get_server_by_discord_id(member.guild.id) server = self._servers.get_server_by_discord_id(member.guild.id)
try: try:
if before.channel == after.channel:
return
# join # join
if ( if (
before.channel is None before.channel is None

View File

@ -52,12 +52,12 @@ class BaseOnVoiceStateUpdateEventScheduledEventBonus(OnVoiceStateUpdateABC):
return return
server = self._servers.get_server_by_discord_id(member.guild.id) server = self._servers.get_server_by_discord_id(member.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id) user = self._users.get_user_by_discord_id_and_server_id(member.id, server.id)
if active_event.participants.any(lambda x: x.user_id == user.user_id): if active_event.participants.any(lambda x: x.id == user.id):
self._logger.debug(__name__, f"Module {type(self)} stopped") self._logger.debug(__name__, f"Module {type(self)} stopped")
return return
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id) settings: BaseServerSettings = self._base_helper.get_config(server.discord_id)
user.xp += settings.xp_per_event_participation user.xp += settings.xp_per_event_participation
self._users.update_user(user) self._users.update_user(user)
self._db.save_changes() self._db.save_changes()

View File

@ -36,9 +36,9 @@ class BaseReactionHandler:
self._logger.trace(__name__, f"Handle reaction {payload} {r_type}") self._logger.trace(__name__, f"Handle reaction {payload} {r_type}")
guild = self._bot.get_guild(payload.guild_id) guild = self._bot.get_guild(payload.guild_id)
member = guild.get_member(payload.user_id) member = guild.get_member(payload.id)
if member is None: if member is None:
self._logger.warn(__name__, f"User {payload.user_id} in {guild.name} not found - skipping") self._logger.warn(__name__, f"User {payload.id} in {guild.name} not found - skipping")
return return
try: try:

View File

@ -160,7 +160,7 @@
<td> <td>
<div class="btn-wrapper"> <div class="btn-wrapper">
<app-history-btn [history]="autoRoleRule.history" translationKey="view.server.auto_roles.rules.header"></app-history-btn> <app-history-btn *ngIf="!isEditingNew" [history] ="autoRoleRule.history" translationKey="view.server.auto_roles.rules.header"></app-history-btn>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" (click)="onRowEditInit(dt, autoRoleRule, ri)"></button> <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" (click)="onRowEditInit(dt, autoRoleRule, ri)"></button>
<button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash" <button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash"
(click)="deleteAutoRoleRule(autoRoleRule)"></button> (click)="deleteAutoRoleRule(autoRoleRule)"></button>

View File

@ -225,7 +225,7 @@ export class AutoRolesRulesComponent implements OnInit, OnDestroy {
})).subscribe(result => { })).subscribe(result => {
this.isEditingNew = false; this.isEditingNew = false;
this.spinner.hideSpinner(); this.spinner.hideSpinner();
this.toastService.success(this.translate.instant("view.server.auto_roles.rules.message.auto_role_rule_created"), this.translate.instant("view.server.auto_roles.rules.message.auto_role_rule_create_d", { id: result.autoRoleRule.createAutoRoleRule?.id })); this.toastService.success(this.translate.instant("view.server.auto_roles.rules.message.auto_role_rule_create"), this.translate.instant("view.server.auto_roles.rules.message.auto_role_rule_create_d", { id: result.autoRoleRule.createAutoRoleRule?.id }));
this.loadNextPage(); this.loadNextPage();
}); });
return; return;

View File

@ -193,7 +193,7 @@
<div class="btn-wrapper"> <div class="btn-wrapper">
<!-- <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil"--> <!-- <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil"-->
<!-- (click)="onRowEditInit(dt, autoRole, ri)"></button>--> <!-- (click)="onRowEditInit(dt, autoRole, ri)"></button>-->
<app-history-btn [history]="autoRole.history" translationKey="view.server.auto_roles.header"></app-history-btn> <app-history-btn *ngIf="!isEditingNew" [history] ="autoRole.history" translationKey="view.server.auto_roles.header"></app-history-btn>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-sliders-h" [routerLink]="[autoRole.id, 'rules']"></button> <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-sliders-h" [routerLink]="[autoRole.id, 'rules']"></button>
<button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash" <button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash"
(click)="deleteAutoRole(autoRole)"></button> (click)="deleteAutoRole(autoRole)"></button>

View File

@ -18,7 +18,7 @@
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
<button pButton label="{{'common.add' | translate}}" class="icon-btn btn" <button pButton label="{{'common.add' | translate}}" class="icon-btn btn"
icon="pi pi-user-plus" (click)="addLevel(dt)" [disabled]="isEditingNew"> icon="pi pi-user-plus" (click)="addLevel(dt)" [disabled]="isEditingNew || user?.isModerator && !user?.isAdmin">
</button> </button>
<button pButton label="{{'common.reset_filters' | translate}}" icon="pi pi-undo" <button pButton label="{{'common.reset_filters' | translate}}" icon="pi pi-undo"
class="icon-btn btn" (click)="resetFilters()"> class="icon-btn btn" (click)="resetFilters()">
@ -184,7 +184,7 @@
</td> </td>
<td> <td>
<div class="btn-wrapper"> <div class="btn-wrapper">
<app-history-btn [history]="level.history" translationKey="view.server.levels.header"></app-history-btn> <app-history-btn *ngIf="!isEditingNew" [history] ="level.history" translationKey="view.server.levels.header"></app-history-btn>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil"
(click)="onRowEditInit(dt, level, ri)" [disabled]="!user || user.isModerator && !user.isAdmin"></button> (click)="onRowEditInit(dt, level, ri)" [disabled]="!user || user.isModerator && !user.isAdmin"></button>
<button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash" <button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash"

View File

@ -224,7 +224,7 @@
</td> </td>
<td> <td>
<div class="btn-wrapper"> <div class="btn-wrapper">
<app-history-btn [history]="member.history" translationKey="view.server.members.header"></app-history-btn> <app-history-btn *ngIf="!isEditingNew" [history] ="member.history" translationKey="view.server.members.header"></app-history-btn>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil"
(click)="onRowEditInit(dt, member, ri)"></button> (click)="onRowEditInit(dt, member, ri)"></button>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-user" <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-user"

View File

@ -353,6 +353,10 @@
color: $primaryTextColor; color: $primaryTextColor;
} }
.p-dropdown-panel .p-dropdown-items .p-dropdown-item {
color: $primaryTextColor !important;
}
.p-dropdown-panel { .p-dropdown-panel {
background-color: $secondaryBackgroundColor !important; background-color: $secondaryBackgroundColor !important;

View File

@ -353,6 +353,10 @@
color: $primaryTextColor; color: $primaryTextColor;
} }
.p-dropdown-panel .p-dropdown-items .p-dropdown-item {
color: $primaryTextColor !important;
}
.p-dropdown-panel { .p-dropdown-panel {
background-color: $primaryBackgroundColor !important; background-color: $primaryBackgroundColor !important;

View File

@ -357,6 +357,10 @@
color: $primaryTextColor; color: $primaryTextColor;
} }
.p-dropdown-panel .p-dropdown-items .p-dropdown-item {
color: $primaryTextColor !important;
}
.p-dropdown-panel { .p-dropdown-panel {
background-color: $secondaryBackgroundColor !important; background-color: $secondaryBackgroundColor !important;

View File

@ -353,6 +353,10 @@
color: $primaryTextColor; color: $primaryTextColor;
} }
.p-dropdown-panel .p-dropdown-items .p-dropdown-item {
color: $primaryTextColor !important;
}
.p-dropdown-panel { .p-dropdown-panel {
background-color: $primaryBackgroundColor !important; background-color: $primaryBackgroundColor !important;