Skip to content

Commit 5fe83e8

Browse files
committed
CHANGES:
- Warehouse information can be exported and imported via Excel now. - Refactoring of autocompletion calls.
1 parent ecdb098 commit 5fe83e8

File tree

22 files changed

+337
-198
lines changed

22 files changed

+337
-198
lines changed

Scripts/net/DCSServerBot/DCSServerBotUtils.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ end
5757

5858
function saveSettings(settings)
5959
mergedSettings = mergeGuiSettings(settings)
60+
if mergedSettings.name ~= server_name then
61+
server_name = mergedSettings.name
62+
end
6063
U.saveInFile(mergedSettings, "cfg", lfs.writedir() .. "Config/serverSettings.lua")
6164
return true
6265
end

core/const.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"MMHG_IN_HPA",
1111
"QFE_TO_QNH_INHG",
1212
"QFE_TO_QNH_MB",
13+
"MAX_SAFE_INTEGER",
1314
"WEEKDAYS",
1415
"MONTH",
1516
"TRAFFIC_LIGHTS",
@@ -24,7 +25,7 @@
2425
MMHG_IN_HPA = 1.333224
2526
QFE_TO_QNH_INHG = 0.00107777777777778
2627
QFE_TO_QNH_MB = 0.03662667
27-
28+
MAX_SAFE_INTEGER = 9007199254740991 # Lua 5.1 max integer representation, 2^253 - 1
2829

2930
WEEKDAYS = {
3031
0: 'Mon',

core/data/impl/serverimpl.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from contextlib import suppress
2121
from copy import deepcopy
2222
from core import utils, Server
23+
from core.const import MAX_SAFE_INTEGER
2324
from core.data.dataobject import DataObjectFactory
2425
from core.data.const import Status, Channel, Coalition
2526
from core.extension import Extension, InstallException, UninstallException
@@ -399,7 +400,7 @@ def _serialize_value(value: Any) -> Any:
399400
if isinstance(value, bool):
400401
return value
401402
elif isinstance(value, int):
402-
return str(value)
403+
return value if value < MAX_SAFE_INTEGER else str(value)
403404
elif isinstance(value, Enum):
404405
return value.value
405406
elif isinstance(value, dict):

core/utils/discord.py

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from packaging.version import parse, Version
2222
from psycopg.rows import dict_row
2323
from typing import cast, TYPE_CHECKING, Iterable, Any, Callable
24+
from typing_extensions import deprecated
2425

2526
from .helper import get_all_players, is_ucid, format_string, cache_with_expiration
2627

@@ -57,7 +58,6 @@
5758
"print_ruler",
5859
"match",
5960
"find_similar_names",
60-
"get_interaction_param",
6161
"get_all_linked_members",
6262
"NodeTransformer",
6363
"InstanceTransformer",
@@ -406,6 +406,7 @@ def check_roles(roles: Iterable[str | int], member: discord.Member | None = None
406406
return False
407407

408408

409+
@deprecated("Use app_has_role instead")
409410
def has_role(role: str):
410411
"""
411412
Decorator for non-application commands to check if the user has a specific role.
@@ -440,6 +441,7 @@ def predicate(interaction: Interaction) -> bool:
440441
return app_commands.check(predicate)
441442

442443

444+
@deprecated("Use app_has_roles instead")
443445
def has_roles(roles: list[str]):
444446
"""
445447
Decorator for non-application commands to check if the user has one of the provided roles.
@@ -493,9 +495,11 @@ def is_restricted(interaction: discord.Interaction) -> bool:
493495
return True
494496
return False
495497

498+
496499
def restricted_check(interaction: discord.Interaction) -> bool:
497500
return not is_restricted(interaction)
498501

502+
499503
def get_role_ids(plugin: Plugin, role_names) -> list[int]:
500504
role_ids = []
501505
if not isinstance(role_names, list):
@@ -884,29 +888,6 @@ def find_similar_names(list1: list[str], list2: list[str], threshold: int = 90)
884888
return similar_names
885889

886890

887-
def get_interaction_param(interaction: discord.Interaction, name: str) -> Any | None:
888-
"""
889-
Returns the value of a specific parameter in a Discord interaction.
890-
891-
:param interaction: The Discord interaction object.
892-
:param name: The name of the parameter to retrieve.
893-
:return: The value of the parameter, or None if not found.
894-
"""
895-
def inner(root: dict | list) -> Any | None:
896-
if isinstance(root, dict):
897-
if root.get('name') == name:
898-
return root.get('value')
899-
elif isinstance(root, list):
900-
for param in root:
901-
if 'options' in param:
902-
return inner(param['options'])
903-
if param['name'] == name:
904-
return param['value']
905-
return None
906-
907-
return inner(interaction.data.get('options', {}))
908-
909-
910891
def get_all_linked_members(interaction: discord.Interaction) -> list[discord.Member]:
911892
"""
912893
:param interaction: the discord Interaction
@@ -1048,7 +1029,7 @@ def __init__(self, *, unused: bool = False):
10481029

10491030
async def transform(self, interaction: discord.Interaction, value: str | None) -> Instance | None:
10501031
if value:
1051-
node: Node = await NodeTransformer().transform(interaction, get_interaction_param(interaction, 'node'))
1032+
node: Node = await NodeTransformer().transform(interaction, interaction.namespace.node)
10521033
if not node:
10531034
return None
10541035
return node.instances.get(value)
@@ -1061,7 +1042,7 @@ async def autocomplete(self, interaction: discord.Interaction, current: str) ->
10611042
if not await interaction.command._check_can_run(interaction):
10621043
return []
10631044
try:
1064-
node: Node = await NodeTransformer().transform(interaction, get_interaction_param(interaction, 'node'))
1045+
node: Node = await NodeTransformer().transform(interaction, interaction.namespace.node)
10651046
if not node:
10661047
return []
10671048
if self.unused:
@@ -1088,7 +1069,7 @@ async def airbase_autocomplete(interaction: discord.Interaction, current: str) -
10881069
if not await interaction.command._check_can_run(interaction):
10891070
return []
10901071
try:
1091-
server: Server = await ServerTransformer().transform(interaction, get_interaction_param(interaction, 'server'))
1072+
server: Server = await ServerTransformer().transform(interaction, interaction.namespace.server)
10921073
if not server or not server.current_mission:
10931074
return []
10941075
choices: list[app_commands.Choice[int]] = [
@@ -1143,8 +1124,7 @@ async def group_autocomplete(interaction: discord.Interaction, current: str) ->
11431124
# is a user is not allowed to run the interaction, they are not allowed to see the autocompletions also
11441125
if not await interaction.command._check_can_run(interaction):
11451126
return []
1146-
server: Server = await ServerTransformer().transform(interaction,
1147-
get_interaction_param(interaction, 'server'))
1127+
server: Server = await ServerTransformer().transform(interaction, interaction.namespace.server)
11481128
return [
11491129
app_commands.Choice(name=group_name, value=group_name)
11501130
for group_name in set(player.group_name for player in server.get_active_players() if player.group_id != 0)
@@ -1227,16 +1207,15 @@ def __init__(self, *, active: bool | None = None, watchlist: bool | None = None,
12271207
self.vip = vip
12281208

12291209
async def transform(self, interaction: discord.Interaction, value: str) -> Player:
1230-
server: Server = await ServerTransformer().transform(interaction, get_interaction_param(interaction, 'server'))
1210+
server: Server = await ServerTransformer().transform(interaction, interaction.namespace.server)
12311211
return server.get_player(ucid=value, active=self.active)
12321212

12331213
async def autocomplete(self, interaction: Interaction, current: str) -> list[app_commands.Choice[str]]:
12341214
if not await interaction.command._check_can_run(interaction):
12351215
return []
12361216
try:
12371217
if self.active:
1238-
server: Server = await ServerTransformer().transform(interaction,
1239-
get_interaction_param(interaction, 'server'))
1218+
server: Server = await ServerTransformer().transform(interaction, interaction.namespace.server)
12401219
if not server:
12411220
return []
12421221
choices: list[app_commands.Choice[str]] = [

core/utils/squadrons.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from discord import app_commands
55
from psycopg.rows import dict_row
66

7-
from .discord import get_interaction_param, check_roles
7+
from .discord import check_roles
88

99
_all_ = [
1010
'squadron_autocomplete',
@@ -65,7 +65,7 @@ async def squadron_users_autocomplete(interaction: discord.Interaction, current:
6565
if not await interaction.command._check_can_run(interaction):
6666
return []
6767
try:
68-
squadron_id = get_interaction_param(interaction, 'squadron')
68+
squadron_id = interaction.namespace.squadron
6969
if not squadron_id:
7070
return []
7171
async with interaction.client.apool.connection() as conn:
@@ -94,7 +94,7 @@ def get_squadron_admins(node: Node, squadron_id: int) -> list[int]:
9494

9595
def squadron_role_check():
9696
def predicate(interaction: discord.Interaction) -> bool:
97-
squadron_id = get_interaction_param(interaction, 'squadron')
97+
squadron_id = interaction.namespace.squadron
9898
if isinstance(squadron_id, int):
9999
admins = get_squadron_admins(interaction.client.node, squadron_id)
100100
if interaction.user.id in admins:

plugins/admin/commands.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ async def available_modules_autocomplete(interaction: discord.Interaction,
4646
if not await interaction.command._check_can_run(interaction):
4747
return []
4848
try:
49-
node = await utils.NodeTransformer().transform(interaction, utils.get_interaction_param(interaction, "node"))
49+
node = await utils.NodeTransformer().transform(interaction, interaction.namespace.node)
5050
available_modules = (set(await node.get_available_modules()) -
5151
set(await node.get_installed_modules()))
5252
return [
@@ -64,7 +64,7 @@ async def installed_modules_autocomplete(interaction: discord.Interaction,
6464
if not await interaction.command._check_can_run(interaction):
6565
return []
6666
try:
67-
node = await utils.NodeTransformer().transform(interaction, utils.get_interaction_param(interaction, "node"))
67+
node = await utils.NodeTransformer().transform(interaction, interaction.namespace.node)
6868
available_modules = await node.get_installed_modules()
6969
choices: list[app_commands.Choice[str]] = [
7070
app_commands.Choice(name=x, value=x)
@@ -81,8 +81,7 @@ async def label_autocomplete(interaction: discord.Interaction, current: str) ->
8181
if not await interaction.command._check_can_run(interaction):
8282
return []
8383
try:
84-
server: Server = await utils.ServerTransformer().transform(
85-
interaction, utils.get_interaction_param(interaction, 'server'))
84+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
8685
if not server:
8786
return []
8887
config = interaction.client.cogs['Admin'].get_config(server)
@@ -102,8 +101,7 @@ async def label_autocomplete(interaction: discord.Interaction, current: str) ->
102101

103102
async def _mission_file_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
104103
try:
105-
server: Server = await utils.ServerTransformer().transform(
106-
interaction, utils.get_interaction_param(interaction, 'server'))
104+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
107105
file_list = await server.getAllMissionFiles()
108106
exp_base = await server.get_missions_dir()
109107
choices: list[app_commands.Choice[str]] = [
@@ -121,11 +119,10 @@ async def file_autocomplete(interaction: discord.Interaction, current: str) -> l
121119
if not await interaction.command._check_can_run(interaction):
122120
return []
123121
try:
124-
server: Server = await utils.ServerTransformer().transform(
125-
interaction, utils.get_interaction_param(interaction, 'server'))
122+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
126123
if not server:
127124
return []
128-
label = utils.get_interaction_param(interaction, "what")
125+
label = interaction.namespace.what
129126
# missions will be handled differently
130127
if label == 'Missions':
131128
return await _mission_file_autocomplete(interaction, current)
@@ -211,9 +208,9 @@ async def get_dcs_branches(interaction: discord.Interaction, current: str) -> li
211208
async def get_dcs_versions(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
212209
if not await interaction.command._check_can_run(interaction):
213210
return []
214-
branch = utils.get_interaction_param(interaction, 'branch')
211+
branch = interaction.namespace.branch
215212
if not branch:
216-
node = await NodeTransformer().transform(interaction, utils.get_interaction_param(interaction, 'node'))
213+
node = await NodeTransformer().transform(interaction, interaction.namespace.node)
217214
branch, _ = await node.get_dcs_branch_and_version()
218215
versions = await interaction.client.node.get_available_dcs_versions(branch)
219216
return [
@@ -240,8 +237,7 @@ async def all_servers_autocomplete(interaction: discord.Interaction, current: st
240237
async def extensions_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
241238
if not await interaction.command._check_can_run(interaction):
242239
return []
243-
server: Server = await utils.ServerTransformer().transform(
244-
interaction, utils.get_interaction_param(interaction, 'server'))
240+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
245241
extensions = await server.list_extension()
246242
current = current.casefold()
247243
choices: list[app_commands.Choice[str]] = [

plugins/backup/commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ async def get_all_dates(node: Node, target: str) -> list[str]:
4848
if not await interaction.command._check_can_run(interaction):
4949
return []
5050
target = interaction.client.cogs['Backup'].locals.get('target')
51-
node = await utils.NodeTransformer().transform(interaction, utils.get_interaction_param(interaction, "node"))
51+
node = await utils.NodeTransformer().transform(interaction, interaction.namespace.node)
5252
return [
5353
app_commands.Choice(name=date, value=date) for date in await get_all_dates(node, target)
5454
if not current or current in date

plugins/gamemaster/commands.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ async def scriptfile_autocomplete(interaction: discord.Interaction, current: str
2323
if not await interaction.command._check_can_run(interaction):
2424
return []
2525
try:
26-
server: Server = await utils.ServerTransformer().transform(interaction,
27-
utils.get_interaction_param(interaction, 'server'))
26+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
2827
if not server:
2928
return []
3029
base_dir = os.path.join(await server.get_missions_dir(), 'Scripts')
@@ -65,7 +64,7 @@ async def campaign_servers_autocomplete(interaction: discord.Interaction, curren
6564
if not await interaction.command._check_can_run(interaction):
6665
return []
6766
try:
68-
campaign_name = utils.get_interaction_param(interaction, 'campaign')
67+
campaign_name = interaction.namespace.campaign
6968
async with interaction.client.apool.connection() as conn:
7069
cursor = await conn.execute("""
7170
SELECT DISTINCT server_name FROM campaigns_servers

plugins/lotatc/commands.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,10 @@ async def gci_autocomplete(interaction: discord.Interaction, current: str) -> li
2222
if not await interaction.command._check_can_run(interaction):
2323
return []
2424
try:
25-
server: Server = await utils.ServerTransformer().transform(interaction,
26-
utils.get_interaction_param(interaction, 'server'))
25+
server: Server = await utils.ServerTransformer().transform(interaction, interaction.namespace.server)
2726
if not server:
2827
return []
29-
coalition: str = utils.get_interaction_param(interaction, 'coalition')
28+
coalition: str = interaction.namespace.coalition
3029
listener = interaction.client.cogs['LotAtc'].eventlistener
3130
choices: list[app_commands.Choice[str]] = [
3231
app_commands.Choice(name=x, value=x)

0 commit comments

Comments
 (0)