Skip to content

Commit d9fc476

Browse files
committed
Add --config-file, remove EP2025 default
1 parent 175fc62 commit d9fc476

3 files changed

Lines changed: 40 additions & 18 deletions

File tree

README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,16 @@ Create a Discord bot with the privileges for receiving `GUILD_MEMBER` events on
4848

4949
### Command-line usage
5050

51-
* Set the environment variable `BOT_TOKEN` to the bot's access token.
52-
* Install this package, e.g., with `pip install .` or `uv sync`.
53-
* CLI: Run `discord-guild-configurator --guild-id <GUILD_ID>`. You can use `--verbose` or `--debug` to see more output.
54-
55-
NOTE: This will apply the [EuroPython 2025 configuration](./src/discord_guild_configurator/configs/ep2025_config.py)
56-
to the specified guild.
57-
See below for instructions on how to configure the guild with your own configuration.
51+
- Set the environment variable `BOT_TOKEN` to the bot's access token.
52+
- Install this package, e.g., with `pip install .` or `uv sync`.
53+
- Run `discord-guild-configurator --guild-id <GUILD_ID> --config-file <JSON_FILE>`.
54+
- You can use `--verbose` or `--debug` to receive more detailed output.
5855

5956
### Programmatic usage
6057

6158
```python
6259
# Option 1: Create guild configuration programmatically
60+
from discord_guild_configurator.configurator import GuildConfigurator
6361
from discord_guild_configurator.models import GuildConfig
6462

6563
GUILD_CONFIG = GuildConfig(...)
@@ -77,11 +75,15 @@ GUILD_CONFIG = GuildConfig.model_validate_json(config_file_content)
7775
# Apply the configuration
7876
from discord_guild_configurator.bot import GuildConfigurationBot, run_bot
7977

80-
BOT_TOKEN = "..."
78+
BOT_TOKEN = "YOUR_TOKEN"
8179
GUILD_ID = 123456789
8280

83-
configurator = GuildConfigurationBot(GUILD_ID, GUILD_CONFIG)
84-
run_bot(configurator, BOT_TOKEN)
81+
async def configure_guild(guild) -> None:
82+
configurator = GuildConfigurator(guild)
83+
await configurator.apply_configuration(GUILD_CONFIG)
84+
85+
bot = GuildConfigurationBot(GUILD_ID, action=configure_guild)
86+
run_bot(bot, BOT_TOKEN)
8587
```
8688

8789
## Development

src/discord_guild_configurator/bot.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
from __future__ import annotations
22

3+
import logging
34
import sys
45
from typing import TYPE_CHECKING, Any, Final
56

67
import discord
8+
from discord import Guild
79
from discord.ext.commands import Bot
810

9-
from discord_guild_configurator.configurator import GuildConfigurator, logger
10-
1111
if TYPE_CHECKING:
12-
from discord_guild_configurator.models import GuildConfig
12+
from collections.abc import Awaitable, Callable
13+
1314

15+
logger = logging.getLogger(__name__)
1416

1517
class GuildConfigurationBot(Bot):
16-
def __init__(self, guild_id: int, guild_template: GuildConfig) -> None:
18+
def __init__(self, guild_id: int, action: Callable[[Guild], Awaitable[None]]) -> None:
1719
"""Discord bot which exports all guild members to .csv files and then stops itself."""
1820
intents = discord.Intents.all()
1921
intents.presences = False
2022
super().__init__(intents=intents, command_prefix="$")
2123

2224
self.guild_id: Final[int] = guild_id
23-
self.guild_template: Final[GuildConfig] = guild_template
25+
self.action: Final[Callable[[Guild], Awaitable[None]]] = action
2426

2527
async def on_ready(self) -> None:
2628
"""Event handler for successful connection."""
2729
guild = self.get_guild(self.guild_id)
2830
if guild is None:
2931
raise RuntimeError(f"Could not find guild with ID {self.guild_id}")
30-
await GuildConfigurator(guild).apply_configuration(self.guild_template)
32+
await self.action(guild)
3133

3234
await self.close()
3335

src/discord_guild_configurator/main.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@
55
import logging
66
import os
77
import sys
8+
from pathlib import Path
9+
from typing import TYPE_CHECKING
810

911
from discord_guild_configurator.bot import GuildConfigurationBot, run_bot
10-
from discord_guild_configurator.configs.ep2025_config import SERVER_CONFIG
12+
from discord_guild_configurator.configurator import GuildConfigurator
13+
from discord_guild_configurator.models import GuildConfig
14+
15+
if TYPE_CHECKING:
16+
import discord
1117

1218
DESCRIPTION = """\
1319
Configure a Discord guild.
@@ -68,6 +74,12 @@ def main() -> None:
6874
formatter_class=argparse.RawTextHelpFormatter,
6975
)
7076
parser.add_argument("--guild-id", type=int, required=True, help="ID of the guild to configure")
77+
parser.add_argument(
78+
"--config-file",
79+
type=Path,
80+
required=True,
81+
help="Path to the guild configuration file (JSON)",
82+
)
7183
parser.add_argument("--verbose", action="store_true", help="Enable INFO logging")
7284
parser.add_argument("--debug", action="store_true", help="Enable DEBUG logging")
7385
args = parser.parse_args()
@@ -78,7 +90,13 @@ def main() -> None:
7890

7991
configure_logging(debug=args.debug, verbose=args.verbose)
8092

81-
bot = GuildConfigurationBot(args.guild_id, SERVER_CONFIG)
93+
guild_config = GuildConfig.model_validate_json(args.config_file.read_text(encoding="UTF-8"))
94+
95+
async def configure_guild(guild: discord.Guild) -> None:
96+
configurator = GuildConfigurator(guild)
97+
await configurator.apply_configuration(guild_config)
98+
99+
bot = GuildConfigurationBot(args.guild_id, configure_guild)
82100
asyncio.run(run_bot(bot, bot_token))
83101

84102

0 commit comments

Comments
 (0)