Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
If you are reading this on GitHub, you may consider switching to the docs to benefit Sphinx internal links to Python objects: https://lg-rez.readthedocs.io/fr/2.2.0/changelog.html
2.4.3 - 2022-05-26¶
Fixed¶
features.sync.process_mort()
crashed if dead player was gerant of boudoirs, disallowing sync of dead players;!planif
crashed for dates in the past;!mp
crashed if combined names were > 32 characters long;!refill
crashed if only one action was refillable;blocs.tools.mention_MJ()
always returned a role mention.
2.4.2 - 2022-05-01¶
Fixed¶
server_structure.json
was not included in package data;Minimal Python version was not updated (must be >=3.10 since 2.4).
2.4.1 - 2022-04-17¶
Fixed¶
Fix dependency conflicts;
ReadTheDocs could not compile due to multiple problems;
Missed doc for new module
blocs.structure
.
2.4.0 - 2022-04-17¶
Added¶
Server automatic setup (guild, channels, roles, emojis…):
New command
!setup
;New module
blocs.structure
to check server structure;New config variables
config.server_structure
(default: new fileserver_structure.json
) andconfig.is_setup
;New functions
blocs.gsheets.get_files_in_folder()
,blocs.gsheets.download_file()
andconfig.set_config_from_server_structure()
;
Remind to enable Dashboard backup Google Apps trigger in
!cparti
;Put role name in player’s private chan topic on role sync;
New subcommands
!boudoir find
and!boudoir help
;New command
!mp
to easily create a boudoir with some other player;New command
!cfini
to automatically delete tasks at game end;New command
!nextroll
.
Changed¶
Boudoirs are now transferred to most ancient member when owner dies;
A cross mark is now added to boudoir name when moved to cemetery;
!refill
: now ask to chose action (if > 1) instead of refilling all;!lore
: better handle of players mentions (1 to 4 words);!planif
: now planif to tomorrow if past date (rather that instant);!cancel
: now directly cancels (no confirmation), but show command to type to re-planif task;features.gestion_actions.add_action()
now creates action only if not already existing (changed signature: now takes action parameters);Bumped packages dependencies.
Fixed¶
Some bot parts did not work because of circular imports between
bdd.model_joueurs
andblocs.tools
. Fixed by movingBoudoir.add_joueur
/Boudoir.remove_joueur
to new functionsfeatures.chans.add_joueur_to_boudoir()
/features.chans.remove_joueur_from_boudoir()
.Crash when trying to add a joueur to a boudoir in cemetery;
!lore
sometimes crashed when evaluating a role mention;Admin console was endlessly rebooting when sending an EOF or when input pipe was closed (e.g. bot not launched from a TTY);
README’s What’s New in 2.3 was missing.
2.3.2 - 2021-11-11¶
Changed¶
When a player is removed from / added to a boudoir, the boudoir is automatically sent to / from the boudoirs cemetery;
!roll
now has limitations to avoid bot overloading by huge rolls; new special valuesludopathe
andtavernier
.
Fixed¶
Automatic archiving of boudoirs when a player dies was not working as intended.
2.3.1 - 2021-11-10¶
Changed¶
When a player die, useless boudoirs are now automatically moved in category
config.old_boudoirs_category_name
(new config option, checked at startup) by new functionfeatures.sync.process_mort()
;Code optimizations using new utility functions
blocs.tools.multicateg()
,blocs.tools.in_multicateg()
and new decoratorfeatures.chans.gerant_only()
;Added special values for
!roll
:joueur
,vivant
,mort
,rôle
,camp
.
Fixed¶
Joueurs could be added several times to boudoirs (several invites);
Some
!boudoir
options parameters were mandatory where they should not;One-command limitation was not working with private commands outside private chans.
2.3.0 - 2021-11-06¶
Added¶
New subcommand
!boudoir ping
;New admin console to execute code/commands from the shell running the bot (BETA: direct commands execution) using new module
blocs.console
;New indicative messages about the
stop
keyword;New property
bdd.Camp.embed()
(likebdd.Role.embed()
).
Changed¶
Command
!roles
separated inro!roles
and new command!camps
to address some names overlapping issues and for more clarity.
Fixed¶
Help message was not accurate for some subcommands errors;
Adding IA reactions could produce API 400 errors (empty messages).
2.2.2 - 2021-11-01¶
Changed¶
Made gsheets operations asynchronous (using new dependency module
gspread_asyncio
):blocs.gsheets.connect()
andupdate()
are now asynchronous and work withAsyncioGspreadWorksheet
objects; some dependant functions made asynchronous too.
Fixed¶
References to
tools
could not be used in reactions evaluations.Bot activity was sometimes lost when errors occured.
Messages reactions caused fatal errors in some cases.
2.2.1 - 2021-10-24¶
Fixed¶
Critical error in
features.sync.transtype()
caused by SQLAlchemy internals changes between 1.3.x and 1.4.x.Minor fixes in some commands docstrings.
2.2.0 - 2021-10-06¶
Added¶
New command
!modif
to edit a bot message;New commands table in
lgrez.features
doc page;New convenience method
blocs.env.__getattr__()
.
Changed¶
Extended to Python 3.10
Bumped all requirements to their latest version
Fixed¶
Diverse documentation fixes.
2.1.4 - 2021-07-10¶
Changed¶
!lore
can now replace@role_slug
(config.Role
attributes only) with role mention;!doas
can now act for players that left the server (limited range);Database host and name is now printed at bot startup;
.gitignore
now ignores allstart_bot*.py
files.
Fixed¶
!open
/!close
: new safety check to avoid double opening/closing;Added
config.is_ready
to avoid doubleLGBot.on_ready()
calls;Added unique constraint to
bdd.Role
-bdd.BaseAction
junction table to avoid duplicate rows;!boudoir
: dead players could create some and sometimes write messages in;!lore
did not correctly detect some docs ID;!lore
formatting failed on some specific cases (e.g bullet lists + italic);!action
:bdd.UtilEtat.remplie
was sometimes used istead ofbdd.UtilEtat.ignoree
;Fixed fatal errors on
blocs.tools.private()
commands warning messages,features.voter_agir.get_cible()
,!infos
, and role creation detection (if missing required roles);Bumped dependencies security upgrades.
2.1.3 - 2021-04-26¶
Changed¶
!boudoir
:invite
andexpulse
now take only one name as a full argument, other various improvements;!sync
: role sync message now hides role slug.
Fixed¶
blocs.tools.private()
: fixedblocs.one_command
bypass;!actions
: new action creation did not properly added action;!open
/!close
: all open/close triggers were not triggered;features.gestion_actions.close_action()
: base cooldown was set on actions even if no decision was made;
2.1.2 - 2021-04-23¶
Changed¶
!annoncemort
can now prepair several embeds and post them at once;!addIA
: new fast-add syntax and duplicate tirggers security check.
Fixed¶
Error when using
!menu
before the game has started;« stop » messages were detected by every waiting functions, even if an other chennel; this is solved by new
chan
keyword argument toblocs.tools.wait_for_message()
. Dependant functions were modified consequently; while optionnal, omitting this argument may lead to undetected « stop » messages.
2.1.1 - 2021-04-15¶
Fixed¶
Critical error (importing non-requied package) in
__main__.py
;Bad order in inscription messages if chambre and additional step.
2.1.0 - 2021-04-13¶
Added¶
New Actions System:
Extended Data model with tables
bdd.Utilisation
,bdd.BaseCiblage
,bdd.Ciblage
and enumsbdd.CibleType
,bdd.UtilEtat
,bdd.Vote
;New columns
bdd.BaseAction.decision_format
andbdd.Action.active
;New properties
bdd.BaseAction.temporalite
andbdd.Role.embed
to describe a role, used in!role
,!fillroles
andfeatures.IA.trigger_roles()
;New properties
bdd.Action.utilisation_ouverte
,bdd.Action.derniere_utilisation
,bdd.Action.decision
, andbdd.Action.is_open
/bdd.Action.is_waiting
(hybrid);New method
bdd.Joueur.action_vote()
;New hybrid properties
bdd.Joueur.est_vivant
andbdd.Joueur.est_mort
;New class methods
bdd.ActionTrigger.open()
andbdd.ActionTrigger.close()
;New function
features.voter_agir.get_cible()
, used by!vote
,!votemaire
,!voteloups
et!action
to handle user inputs;!cparti
now add « vote actions » to all players;
Task postponing now uses Discord-py webhooks:
dropped requirement for
discord-webhook
module;tasks now use
config.webhook
, created byLGBot.on_ready()
if not existing;new method
bdd.Tache.send_webhook()
;deleted
blocs.webhook
module and usage ofLGREZ_WEBHOOK_URL
environnement variable;
New boudoirs management system:
New tables
bdd.Boudoir
andbdd.Bouderie
;New group command
!boudoir
(with 8 subcommands) in new modulefeatures.chans
;New configuration option
config.boudoirs_category_name
, loaded byLGBot.on_ready()
,Updated
!help
and doc tools to handle group commands;
New command
!lore
using new Google Docs connection functionblocs.gsheets.get_doc_content()
;Miscellaneous:
New function
blocs.tools.boucle_query()
for generic database instance lookup interactions;New method
LGBot.check_and_prepare_objects()
(originally directly inLGBot.on_ready()
), called by Discord events concerning roles, channels, emojis and webhooks ;New customizable function
config.additional_inscription_step()
;blocs.tools.wait_for_react_clic()
andblocs.tools.yes_no()
: new kwargfirst_text
;New column
bdd.Role.actif
,!roles
,!fillroles
and IA now restricts to roles withactif = True
;New convenience function
bdd.base.autodoc_DynamicOneToMany()
for documenting dynamicly loaded one-to-many relationships;New option
nullable
forbdd.base.autodoc_ManyToOne()
;
Changed¶
Updated existing data classes attributes to link to new tables;
Made
bdd.Action.base
nullable and addedbdd.Action.vote
optionnal attributes to handle votes in a cleaner way (with instance initialization integrity check);Updated
features.open_close.recup_joueurs()
,!open
,!close
and!remind
;features.gestion_actions.delete_action()
now updatesbdd.Action.active
insteade of deleting the instance;features.voter_agir.export_vote()
signature changed;!plot
now uses new actions system instead of loading votes from the Gsheet:removed config options
tdb_votecond_column
,tdb_votantcond_column
,tdb_votemaire_column
andtdb_votantmaire_column
;it now automatically computes votes additions and modifications (Corbeau / Intrigant), using new config options
config.ajout_vote_baseaction
,config.n_ajouts_votes
,config.modif_vote_baseaction
;
!fillroles
now synchronisebdd.BaseCiblage
too (seeconfig.max_ciblages_per_action
) and post camps descriptions;Moved
!addhere
and!purge
fromfeatures.annexe
to new modulefeatures.chans
;Updated some string columns max lengths;
Made
__str__\ `
implementation specific for :class:.bdd.Role\ ``, :class:
.bdd.Camp, :class:
.bdd.BaseActionand :class:
.bdd.Joueur`.
Removed¶
Tables columns
bdd.Joueur._vote_condamne
,bdd.Joueur._vote_maire
,bdd.Joueur._vote_loups
,bdd.Action._decision
,bdd.BaseAction.changement_cible
;.blocs.webhook
module.
Fixed¶
features.voter_agir.export_vote()
(!vote*
et!action
): used hard-written sheet names istead ofconfig.db_votecond_sheet
,config.db_votemaire_sheet
,config.db_voteloups_sheet
andconfig.db_actions_sheet
;Documentation errors & typos.
2.0.0 - 2021-03-24¶
Major refactorings¶
Data management¶
blocs.bdd
moved tobdd
module and splitted inbdd.base
(base classes and utilities),bdd.enums
(enums, directly imported in.bdd
), andbdd.model_joueurs
,bdd.model_jeu
,bdd.model_actions
,bdd.model_ia
modules (data classes, directly imported inbdd
);Every data classes names changed to singular names (
bdd.Joueur
,bdd.Role
…);Implemented SQLAlchemy relationships and made foreign key arguments private (
Joueur.role
->Joueur._role_slug
,Joueur.role
= direct access toRole
object);Added custom metaclass
bdd.TableMeta
for class tables: more robust implementation ofTable.query
, and other convenience properties;Enhanced data classes with custom properties and classmethods:
bdd.Joueur.member()
,bdd.Joueur.private_chan()
,bdd.Joueur.from_member()
,bdd.Role.nom_complet()
,bdd.Role.default()
,bdd.Camp.default()
,bdd.Camp.discord_emoji()
,bdd.Camp.discord_emoji_or_none()
;Enhanced data classes with instances methods:
add()
,delete()
(global handy methods),bdd.Tache.add()
, and specificbdd.Tache.delete()
,bdd.Tache.register()
,bdd.Tache.cancel()
,bdd.Tache.execute()
;Use Enums when needed:
bdd.Statut
,bdd.ActionTrigger
,bdd.CandidHaroType
;bdd.__all__
contains all data classes (forimport *
).
Global namespace¶
New config
namespace module for:
Global variables: implemented system of readiness check on attributes (through new
blocs.ready_check
module), used for:Bot objects:
config.bot
(loaded byLGBot.run()
) andconfig.loop
(loaded byLGBot.on_ready()
),Server:
config.guild
(loaded byLGBot.on_ready()
),Database connection:
config.engine
andconfig.session
(loaded bybdd.connect()
),Discord objects:
config.Role
,config.Channel
,config.Emoji
classes store roles/channels/emojis the bot needs to work, registered as names (customizable) and then transformed in connected objects byLGBot.on_ready()
.
Customization:
Private channels creation:
config.private_chan_prefix
,config.private_chan_category_name
,Old
bot.config
keys:debut_saison
,demande_chambre
,chambre_mj
,output_liveness
.
Consequences:
LGBot is no more thread-safe: only one bot instance should run concurrently in an interpreter.
« Connected » arguments (
bot
,ctx
,loop
…) removed from several functions signatures, now usingconfig
attributes:blocs.tools.channel()
,role()
,member()
,emoji()
,log()
,yes_no()
,wait_for_message()
,boucle_message()
,wait_for_react_clic()
,choice()
,create_context()
;features.gestion_actions.add_action()
,delete_action()
,open_action()
,close_action()
;features.IA.process_IA()
,trigger_reactions()
,trigger_sub_reactions()
,trigger_gif()
;
Also added¶
bdd.Camp
table (and madebdd.Joueur.camp
andbdd.Role.camp
relationships);bdd.base.autodoc_Column()
,autodoc_OneToMany()
,autodoc_ManyToOne()
andautodoc_ManyToMany()
convenience functions to easily document bdd attributes;bdd.Tache.handler
convenience property;blocs.tools.en_pause()
helper function.
Also changed¶
bot.Special
cog moved to newfeatures.special
module.LGbot
one-command-at-a-time system moved to newblocs.one_command
module.Renamed
blocs.bdd.Tables
inlgrez.bdd.tables
, and made it auto-build by SQLAlchemy Declarative;Renamed
blocs.bdd.Base
inlgrez.bdd.base.TableBase
;<Table>.query
usesconfig.session
(raisesblocs.ready_check.NotReadyError
if not initialised);made
gestion_actions.get_actions
not async;Adapted
!roles
behavior to newCamp
table;Removed unused option
chan
fromfeatures.gestion_actions.open_action()
andclose_action()
;blocs.tools.next_occurence()
now relies ondebut_pause()
andfin_pause()
functions instead of hard-coded pause times;Updated the Configuration Assistant Tool (
__main__.py
) with some changes on Google Sheets script editor and other minor changes;Splitted API Reference in several doc pages, and other global documentation and codestyle improvements (source code now almost entirely PEP8-compliant).
Also removed¶
!modifIA
: removed option to edit both triggers and response;Made
blocs.bdd.BaseActionsRoles
private: use directlybdd.BaseAction.roles
andbdd.Role.base_actions
many-to-many relationship attributes);bdd.BaseAction
: removedbase_
arguments, not specific to the action (useaction.base.<arg>
instead);blocs.tools
: removedemoji_camp
,private_chan
andnom_role
functions (usebdd.Camp.discord_emoji
ordiscord_emoji_or_none
properties /bdd.Joueur.private_chan
property /bdd.Role.nom
attribute orbdd.Role.nom_complet
property instead);Removed
blocs.bdd_tools
module (use<Table>.columns
and<Table>.primary_col
properties,<Table>.find_nearest()
method, andfeatures.sync.transtype()
function instead);Removed
features.taches.add_task
,delete_task
,execute
functions (usebdd.Tache.add()
,delete()
andexecute()
methods instead);Removed
LGBot.config
attribute (uselgrez.config
module instead).
1.2.0 - 2020-12-18¶
Added¶
Commands:
!vivants
: new aliases!joueurs
and!vivant
/!morts
: new aliases!mort
.!post
(infeatures.communication.Communication
) to send a message to a specific channel.!panik
(inbot.Special
) to instantly kill the bot.!actions
(infeatures.informations.Informations
) to see and edit players actions [beta].!quiest
and!rolede
(infeatures.informations.Informations
) to see players with a given role and vice versa.!reactfals
(alias!rf
, infeatures.IA.GestionIA
) using new functionfeatures.IA.fetch_tenor
.!xkcd
(infeatures.annexe.Annexe
).
Bot behavior:
New IA rule: « A ou B » ==> « B » (
features.IA.trigger_a_ou_b
).!plot cond
: thumbnail of camp.!open cond
: send post on #haros and wipes.New liveness checking system: new method
LGBot.i_am_alive
writes every 60s current UTC time to a"alive.log"
(setLGBot.config["output_liveness"]
toTrue
to enable)
API usage:
Inscription: customize default chambre with
LGBot.config["chambre_mj"]
.blocs.tools.yes_no
: newadditionnal
option to add aditionnal emojis.
Changed¶
Commands:
!send
can now accept a player name (send to private chan).!plot cond
now shows faction (emoji) of killed player.!annoncemort
now announces if killed player is living-dead.!sync
now asks for confirmation before applying modifications.
Bot behavior:
Calling a command when already in a command now tries to stop running command and run afterwards instead of aborting.
Actions by emojis: only trigger in private chans.
Now sends a reminder every morning to always-usable actions.
API usage:
Renamed
features.IA.tenor
infeatures.IA.trigger_gif
(consistency).features.sync
: better management of modification with new classTDBModif
and of exceptions with new specific functionvalidate_sync
.tools.bdd_tools.find_nearest
: standardized first word comparison withmatch_first_word
option.!shell
: now using (new)blocs.realshell
module (based on (new dependency)asyncode
module) instead of (removed)blocs.pseudoshell
.
Other minor improvements.
Fixed¶
Fixed critical bug when changing
role
(through!sync
).features.taches
: fixed critical bug when too much tasks at the same times (Discord’s webhooks rate limits).Inscription: fixed critical bug when > 50 players.
Some docstrings corrections.
Other minor bugs.
1.1.0 - 2020-11-03¶
Added¶
New command
!annoncemort
(in new modulefeatures.communication
).Added
LGBot.config
to permit easier bot customization.Customize inscription with
LGBot.config["demande_chambre"]
and["debut_saison"]
.
!help
now shows bot version and commands outside of cogs.!open cond/maire
now wipes CandidHaros.!refill
now opens back permanent actions with new charges.Documentation now covers every public classes, functions and commands.
Changed¶
Made some functions private (leading
_
).Changed data attributes with leading underscores (like
Joueurs._chan_id
) with trailing underscores (Joueurs.chan_id_
).Data column
Joueurs.chambre
is now nullable.!fals
can now be used in non-private channels.blocs.bdd_tools.find_nearest
is no longer a coroutine.Some refactoring:
features.informations.emoji_camp
moved toblocs.tools.emoji_camp
.!plot
moved fromfeatures.actions_publiques
tofeatures.communication
.!send
and!embed
moved fromfeatures.annexe
tofeatures.communication
.!fillroles
moved fromfeatures.remplissage_bdd
(deleted) tofeatures.communication
.
Removed¶
Deleted command
!droptable
.Deleted module
features.remplissage_bdd
.
Fixed¶
Issue with bot intents: proprer access to member list.
Improved handling of BDD disconnections.
Critical bug with
!stop
and voting commands.!plot
now creates./figures
folder if not existing.blocs.tools.wait_for_react_clic
now handles correctly custom emojis.Configuration Assistant Tool: escape
\n
s inLGREZ_GCP_CREDENTIALS
.Other minor bug fixes and improvements.
1.0.3 - 2020-10-22¶
Added¶
Created this changelog
Added module and submodules docstrings and meta informations.
Created Sphinx documentation (beta) on lg-rez.readthedocs.io.
Changed¶
README improvements (badges!) and corrections.
Rewriting of bot.LGBot class and methods docstrings.
More PyPI classifiers.
Fixed¶
Relative links in PyPI project description now redirect to files on GitHub (not to a 404 page).
1.0.2 - 2020-10-20¶
Fixed¶
Critical bug fix.
1.0.1 - 2020-10-20¶
Initial release.