=== Reminders

Provides the ability to schedule reminders.

Feature key: `remind`

==== Commands
Create a reminder::
* Usage: `remind <duration> <text>`
* Description: Creates a reminder with `text` which will be triggered after `duration`. This command uses duration parsing. The reminder will ping when the duration has passed and provide the context of the reminder.
* Example: `remind 1h2m3s text` in order to be reminded in 1 hour 2 minutes and 3 seconds with the reason `text`
Cancelling a reminder::
* Usage `unRemind <reminderId>`
* Description: Cancels this reminder and will cause this reminder to not be executed. Only possible for reminders started by the user executing the command.
Listing all active reminders::
* Usage: `reminders`
* Description: Lists all the currently not yet executed reminders and information about each of them.
Re-schedule a past reminder::
* Usage: `snooze <reminderId> <duration>`
* Description: Schedules the reminder identified by `reminderId` to be triggered after `duration` again. It is only possible to do this for reminders which have already been executed. Only possible for reminders started by the user executing the command.


=== Starboard

Provides the ability to track note worthy posts in a separate channel, identified by the post target `starboard`, because the pins within a channel are limited to 50.
This feature works by users reacting to a message with the appropriate emote. By default this is `&#11088;`, but can be changed via the emote `star`.
There is a configurable threshold a message needs to reach in order to be posted to starboard.
The post in the starboard is continuously updated and depending on the current star count an associated emote is displayed.
When the poster of the message reacts to the message with a star, this is not counted. When the post is deleted from the starboard, the original message cannot appear on the starboard again.

Feature key: `starboard`

==== Emotes
* `star` to vote on posting something to starboard
* `star1` for level 1 of starboard
* `star2` for level 2 of starboard
* `star3` for level 3 of starboard
* `star4` for level 4 of starboard
* `starboardBadge1` used as marker for first place in the command `starStats`
* `starboardBadge2` used as marker for first place in the command `starStats`
* `starboardBadge3` used as marker for first place in the command `starStats`


==== Relevant system configuration
`starLvl1` The amount of stars necessary to appear on the starboard. Default: 5

`starLvl2` The amount of stars necessary in order for the level 2 emote to be used in the starboard post. Default: 8

`starLvl3` The amount of stars necessary in order for the level 3 emote to be used in the starboard post. Default: 13

`starLvl4` The amount of stars necessary in order for the level 4 emote to be used in the starboard post. Default: 17

`starMaxDays` The amount of days after which reactions will be ignored: Default: 7

==== Post targets
`starboard`:: The target used for the messages containing the starboard posts with the current star amount

==== Commands
Showing starboard statistics::
* Usage `starStats [member]`
* Description: Shows the most starred posts, the member with the most received stars and the members rewarding the most stars. If `member` is provided, this command will show the top posts, received stars and given stars for this member. The user is still required to be part of the server.

=== Suggestions

This feature provides the ability for members to post suggestions containing text to the post target `suggestions`. These suggestions can then be accepted or denied by the moderators.
An acceppted/vetoed/rejected suggestion will be deleted after two days (default configuration) from the database

Feature key: `suggestion`

==== Feature modes
`suggestionReminder`:: if enabled, a message will be sent to the post target `suggestionReminder`, after the amount of days configured in `suggestionReminderDays`. Disabled by default.
`suggestionButton` :: if enabled, use buttons instead of reactions for suggestions. Enabled by default.

==== Post targets
`suggestions`:: the target of the messages containing the suggestions
`suggestionReminder`:: the target for the message to remind about suggestions. Requires feature mode `suggestionReminder` to be enabled

==== Emotes
* `suggestionYes` for up-voting a suggestion
* `suggestionNo` for down-voting a suggestion

==== Relevant system configuration
`suggestionReminderDays` The amount of days in which the reminder, from feature mode `suggestionReminder`, should be posted in. Default: 7

==== Commands
Creating a suggestion::
* Usage: `suggest <text>`
* Description: Posts the text to the `suggest` post target and either adds emotes or buttons for voting. If `suggestionReminder` is enabled, this will create a suggestion reminder.
Accepting a suggestion::
* Usage: `accept <suggestionId> [reason]`
* Description: Re-posts the suggestion identified by `suggestionId` and marks the suggestion as accepted. The optional `reason` will be used in this re-post, if provided. This will cancel the suggestion reminder (if it exists). This will also show the amount of votes received, but these are only counted when feature mode `suggestionButton` is enabled.
* Example: `accept 1 okay` in order to accept the suggestion `1` with the reason `okay`
Rejecting a suggestion::
* Usage: `reject <suggestionId> [reason]`
* Description: Re-posts the suggestion identified by `suggestionId` and marks the suggestion as denied. The optional `reason` will be used in this re-post, if provided. This will cancel the suggestion reminder (if it exists). This will also show the amount of votes received, but these are only counted when feature mode `suggestionButton` is enabled.
* Example: `deny 1 not okay` in order to reject the suggestion `1` with the reason `not okay`
Removing a suggestion you created::
* Usage: `unSuggest <suggestionId>`
* Description: This will delete the suggestion identified by `suggestionId` from the channel and the database, but this is only possible within a specified time range (1h by default). This will cancel the suggestion reminder (if it exists)
Vetoing a suggestion::
* Usage : `veto <suggestion> [reason]`
* Description: This command will veto the suggestion, this means, it should be indicated that the suggestion was not rejected by votes, but because it was not acceptable on a fundamental level. This is basically just a different state of the suggestion. This will cancel the suggestion reminder (if it exists). This will also show the amount of votes received, but these are only counted when feature mode `suggestionButton` is enabled.

=== Miscellaneous

This feature provides some utility commands.

Feature key: `utility`

==== Commands
Retrieving the URL of an emote::
* Usage: `showEmote <emote>`
* Description: Posts the name of the emote accompanied with the URL where the image of the emote is available at.

Displaying the avatar or a member::
* Usage: `showAvatar [member]`
* Description: Displays the avatar of the given member accompanied with a URL to access it directly. If no member is provided, the member executing will be used.

Displaying information about members::
* Usage: `userInfo [member]`
* Description: Displays information about a member including: username, ID, activity, nickname (if any), date joined the server and date registered on discord.

Displaying information about the server::
* Usage: `serverInfo`
* Description: Displays information about the server including: ID, server name, owner, member count, creation date, role count, server features and custom emotes of the server.

Choose one of multiple options::
* Usage: `choose [options separated by space]`
* Description: Selects one of the given options and returns it. The options need to be separated by space. If you want to have a space in an option, the complete option needs to be wrapped by ". For example "this is a test" is one whole option.

=== Link embeds

This feature enables the automatic embedding of messages containing a message link.
If a message contains a link to a discord message this will create an embed containing the the message content. This supports image attachments, but not videos or files.
A reaction/button is placed on the embedded message which can be used to delete this embed. Only the original author and the person creating the embed can delete the embed this way.

Feature key: `linkEmbeds`

==== Feature modes
`messageEmbedDeleteButton`:: if enabled, uses a button for removal instead of a reaction

==== Emotes
* `removeEmbed` to remove the embed of a link


=== Repost detection and tracking

This feature can be used to detect whether an image has been posted before on the server. Images are compared by the hash stored in the database, which makes it very strict.
In order to calculate the hash, the image needs to be downloaded. It is possible to show a leaderboard of the most reposting users. Both of these features can be changed via feature modes.
If a reaction has been detected a reaction will be added to the post. If a message contains multiple or the detected repost is not the first image in the message a reaction containing digit indicating the position of the repost will be added.
For example if the repost is the second image in a message, a reaction representing the digit two will be added.

While it can be configured that the feature is only active in certain channels, the detection whether an image is a repost checks all previously posted images from the server (given they have been posted in a channel where the repost check is active).

Feature key: `repostDetection`

==== Feature modes
`download`:: If this is enabled, the images in the configured channels will be downloaded and the hash is calculated basd on the file content. The images are deleted immediately afterwards. If this is disabled, the proxy URL of the image will be used to calculate the hash. Enabled by default.
`leaderboard`:: If this is enabled, the command `repostLeaderboard` will be available. This command shows the leaderboard of the user with the most reposts. Disabled by default.

==== Emotes
* `repostMarker` to indicate that a post has been identified as a repost

==== Commands
Remove stored image posts and reposts of whole server or specific member::
* Usage: `purgeImagePosts [member]`
* Description: If `member` is provided, this will delete all stored image hashes (and their reposts) from the database. If `member` is not provided, this will delete all stored image hashes (and their reposts) from the whole server. Requires you to confirm the command.

Remove reposts of whole server or specific member::
* Usage: `purgeReposts [member]`
* Description: If `member` is provided, this will delete all reposts of the given member. If `member` is not provided, this will delete all reposts in the whole server. Requires you to confirm the command.

Show the leaderboard of reposts::
* Usage: `repostLeaderboard [page]`
* Description: Shows the rank and the amount of reposts for a provided `page`, if `page` is not provided, it will show five users with the highest a mount of reposts. `page` is 1-indexed. It will also show the amount and rank of the user executing.
* Mode Restriction: This command is only available when the feature mode `leaderboard` is enabled.

Enable repost check for a channel group::
* Usage: `enableRepostCheck <groupName>`
* Description: Enables the repost checking for all channels in the channel group identified by `groupName`. This channel group needs to be of type `repostCheck`.

Disable repost check for a channel group::
* Usage: `disableRepostCheck <groupName>`
* Description: Disables the repost checking for all channels in the channel group identified by `groupName`. This channel group needs to be of type `repostCheck`.

Show the channels for which repost check has been enabled::
* Usage: `showRepostCheckChannels`
* Description: Shows the channel groups with their respective channels for which the repost check has been enabled. These can only be channel groups of type `repostCheck`. It can still be enabled if there are now channels in the channel group.


=== Entertainment commands

This feature basically contains a few commands which can be used for entertainment purposes directly

Feature key: `entertainment`

==== Relevant system configuration
`rouletteBullets` The amount of bullets the revolver for `roulette` can hold. Default: 6
`rollDefaultHigh` The default sides of the die for `roll`. Default: 6

Play a round of russian roulette::
* Usage: `roulette`
* Description: Decides, based on the configured amount of bullets possible, whether a shot happens. Shows the result as a message.

Calculate the love chance between two texts::
* Usage: `loveCalc <textA> <xtextB>`
* Description: Decides, by a random chance, the percentage of love between the two given texts and displays it in a message.

Ask a magic 8-ball a question::
* Usage: `8ball <texŧ>`
* Description: Decides the answer for the question, given on a set of pre-defined answers. This happens randomly.

Roll a virtual die::
* Usage: `role [max] [min]`
* Description: Rolls a virtual die. Per default this is a six sided die. If `max` is provided, it changes the amount of sides possible and if `min` is provided, no value below this is possible. If `min` is larger than `max`, it is taken as `max` and vice-versa.

Mock the message of another user::
* Usage: `mock <text/message>`
* Description: Takes the `text` and prints the text with the characters with alternating upper and lower case. If no text is provided, this command requires that the command has been executed in a message which replies to another message. In this case the text to be mocked will be the content of the message which has been replied to. If both is provided, a replied message takes precedence.

Add text as reactions to another message::
* Usage: `react <message> <text>`
* Description: Takes the `text`, converts it into unicode characters, while trying to avoid duplicates, and adds the reactions to the given `message`. If it was not possible to avoid duplicates, or the overall reactions (including already existing reactions) would go over the Discord limit, this command will show an error message, without adding any reaction. Some characters can be replaced with one unicode character, for example 'SOS'.


=== Voice channel context

This feature provides the ability to show certain text channels for certain voice channels and enable voice channels to be used for chatting while in voice channels.

Feature key: `voiceChannelContext`

Create a voice channel context::
* Usage `createVoiceChannelContext <voiceChannel> <role>`
* Description: Creates a connection between the `voiceChannel` and the given `role`. When a member joins the `voiceChannel` they will be given the `role`.
This role can then be used to provide the 'view channel' permission on a text channel which can be used as a 'context channel' for the voice chat.
The voice channel can be provided as a parameter via a mention (type '#!' + voice channel name), channel ID or the channel name.

Deleting a voice channel context::
* Usage `deleteVoiceChannelContext <voiceChannel>`
* Description: Deletes any voice channel context for the given `voiceChannel`. Members will no longer receive a role, when joining the voice channel. The `voiceChannel` can also be a channel ID.