Skip to content

Commit 067b5f3

Browse files
committed
ENHANCEMENTS:
- New commands /convert to convert from DD/DMS to MGRS and vice versa
1 parent 5004871 commit 067b5f3

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

plugins/mission/commands.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@
1313
UnsupportedMizFileException
1414
from datetime import datetime, timezone
1515
from discord import Interaction, app_commands, SelectOption
16-
from discord.app_commands import Range
16+
from discord.app_commands import Range, describe
1717
from discord.ext import commands, tasks
1818
from discord.ui import Modal, TextInput
1919
from io import BytesIO
20+
from mgrs import MGRS
2021
from pathlib import Path
2122
from psycopg.rows import dict_row
2223
from services.bot import DCSServerBot
@@ -128,6 +129,17 @@ def get_name(base_dir: str, path: str):
128129
return []
129130

130131

132+
class DDTransformer(app_commands.Transformer):
133+
def __init__(self):
134+
self.mgrs_converter = MGRS()
135+
136+
async def transform(self, interaction: discord.Interaction, value: Union[str, float]) -> float:
137+
if isinstance(value, str):
138+
return self.mgrs_converter.dmstodd(value)
139+
else:
140+
return value
141+
142+
131143
class Mission(Plugin[MissionEventListener]):
132144

133145
def __init__(self, bot: DCSServerBot, listener: Type[MissionEventListener] = None):
@@ -1939,6 +1951,47 @@ async def validate(self, interaction: discord.Interaction):
19391951
# noinspection PyUnresolvedReferences
19401952
await interaction.response.send_message(_("No menus.yaml found."), ephemeral=True)
19411953

1954+
@command(description=_('Convert values'))
1955+
@app_commands.guild_only()
1956+
@utils.app_has_role('DCS')
1957+
@describe(lat="Latitude in DD or DMS (N491012.12)",
1958+
lon="Longitude in DD or DMS (E011012.34)",
1959+
mgrs="MGRS coordinates")
1960+
async def convert(self, interaction: discord.Interaction, mode: Literal['Lat/Lon => MGRS', 'MGRS => Lat/Lon'],
1961+
lat: Optional[app_commands.Transform[float, DDTransformer]] = None,
1962+
lon: Optional[app_commands.Transform[float, DDTransformer]] = None,
1963+
mgrs: Optional[str] = None):
1964+
mgrs_converter = MGRS()
1965+
if mode == 'Lat/Lon => MGRS':
1966+
if not lat or not lon:
1967+
# noinspection PyUnresolvedReferences
1968+
await interaction.response.send_message("Latitude and longitude must be provided", ephemeral=True)
1969+
return
1970+
if isinstance(lat, str):
1971+
lat = mgrs_converter.dmstodd(lat)
1972+
if isinstance(lon, str):
1973+
lon = mgrs_converter.dmstodd(lon)
1974+
mgrs = mgrs_converter.toMGRS(lat, lon, MGRSPrecision=5)
1975+
# noinspection PyUnresolvedReferences
1976+
await interaction.response.send_message(f"MGRS: {mgrs}")
1977+
elif mode == 'MGRS => Lat/Lon':
1978+
if not mgrs:
1979+
# noinspection PyUnresolvedReferences
1980+
await interaction.response.send_message("MGRS must be provided", ephemeral=True)
1981+
return
1982+
lat, lon = mgrs_converter.toLatLon(mgrs, inDegrees=True)
1983+
d, m, s, f = utils.dd_to_dms(lat)
1984+
lat_dms = ('N' if d > 0 else 'S') + '{:02d}°{:02d}\'{:02d}.{:02d}"'.format(
1985+
int(abs(d)), int(abs(m)), int(abs(s)), int(abs(f)))
1986+
d, m, s, f = utils.dd_to_dms(lon)
1987+
lon_dms = ('E' if d > 0 else 'W') + '{:03d}°{:02d}\'{:02d}.{:02d}"'.format(
1988+
int(abs(d)), int(abs(m)), int(abs(s)), int(abs(f)))
1989+
# noinspection PyUnresolvedReferences
1990+
await interaction.response.send_message(f"{lat_dms} ({lat}), {lon_dms} ({lon})")
1991+
else:
1992+
# noinspection PyUnresolvedReferences
1993+
await interaction.response.send_message("Invalid conversion mode", ephemeral=True)
1994+
19421995
@tasks.loop(hours=1)
19431996
async def expire_token(self):
19441997
async with self.apool.connection() as conn:

requirements.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ lupa==2.5
4343
# Matplotlib: Python 2D plotting library
4444
matplotlib>=3.9.4
4545

46+
# MGRS library
47+
mgrs==1.5.0
48+
4649
# Minidump: Windows Minidump file reader
4750
minidump==0.0.24; sys_platform == 'win32'
4851

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ build==1.3.0
1818
certifi==2025.8.3
1919
cffi==1.17.1
2020
charset-normalizer==3.4.3
21-
click==8.2.1
21+
click==8.3.0
2222
colorama==0.4.6
2323
contourpy==1.3.2
2424
croniter==6.0.0
@@ -31,7 +31,7 @@ exceptiongroup==1.3.0
3131
eyed3==0.9.8
3232
fastapi==0.116.1
3333
filetype==1.2.0
34-
fonttools==4.59.2
34+
fonttools==4.60.0
3535
frozenlist==1.7.0
3636
fuzzywuzzy==0.18.0
3737
gitdb==4.0.12
@@ -49,6 +49,7 @@ markdown-it-py==4.0.0
4949
markupsafe==3.0.2
5050
matplotlib==3.10.6
5151
mdurl==0.1.2
52+
mgrs==1.5.0
5253
minidump==0.0.24 ; sys_platform == "win32"
5354
miniupnpc==2.3.3
5455
multidict==6.6.4

0 commit comments

Comments
 (0)