Getting Started

With the release of slash commands this documentation is way out of date, while the concepts are still the same, almost everything is now available in dropdowns, please type / in Discord and explore the availble commands there, and I'm pretty sure you'll find what you are looking for when you try them out.

Getting started is quite easy, just follow the steps below:

  • Invite the bot with this link: Invite bot
  • Create separate channels for #bot-log, #nodewars and #bot-spam, or something similar sounding.
  • Create two Discord roles under Server settings -> Roles, one for your regular guild members and one for your guild officers.
  • Run the command &bot update logchannel #bot-log
  • Run the command &bot update member role @YourMemberRoleHere
  • Run the command &bot update officer role @YourOfficerRoleHere

This will make sure that the bot can log the things it does by itself, that the default permissions are in place, and that members are properly tagged as active/passive in the database.
Note that only the Member role is used to set members active and passive in the database based on who has that role, while the officer role allows people to use the officer restricted commands.

Members can then register themselves with &mem update, you can create nodewars with &nw new nodewarDate, which they can then attend by pressing the + reaction.

Most other things should be explained in here or with the command &help, for anything else, join us on Discord and ask!

Typical usage

  • Members are registered with &mem update
  • An event is set up with &nw new nodewarDate
  • Members register their attendance with the reactions
  • A couple of days goes by and you still have some undecided, so you use the &nw announce nodewarId command to just ping those still undecided.
  • You win the nodewar so you close it by doing &nw update result nodewarId won, and probably just delete the message.
  • After the nodewar you do &nw attendance nodewarId and realize that some came that didn't sign up and some signed up but didn't come, so you change their attendance with &nw can nodewarId memberId and &nw noshow nodewarId memberId
  • Then around payout time you want to know who attended the most, so you do &mem list node dateFrom dateTo and get a list of everyone's attendance for that period.
  • Even later on you use &graph nw nodes or &graph nw att because you are just a little curious about what nodes you go for the most or how your attendances have been over time.

Member module

Main concepts

Managing members

Or said another way &mem update, probably the most used command in the whole bot, the main idea is to let you and your members register their in game gear info, which can then be used for party sorting, tracking progress and getting a good look at your members.

Active/Passive in the database

Unless you manually delete a member they are kept active/passive in the database depending on them having the Discord member role you registered with &bot update member role @yourMemberRole. If needed you can also use &mem activate memberId and &mem kick memberId to set the active flag in the database manually. Do note that this will be changed again if they lose/get the member role again.

Tracking away status

Not everyone can play all the time, with this you can set your members as away for certain periods, the bot will exclude them from nodewars in that period and notify you when they should be back.

Tracking trials

Originally requested by a guild that wanted to do retrials of their members, it will let you keep track of trial days and notify officer and the member on the day of the trial.

Displaying member info lists

Most people like stats, some more then others, and this should let them compare pretty much everything about the members to their hearts content. Try &mem list top.

Elixirs

Some guilds like to distribute their elixirs amongs party members, by registering elixirs with the bot it can distribute them for you, the distribution can be seen on the "Elixir" tab of the nodewar message. Do &mem consumables for a complete list of the elixirs you can register with the bot.


Commands


&mem update

Probably the one command you want all new members to run

It will by default ask them for their family name, character name, class, level, AP, AAP, and DP. This can be further customized with the &com mem update add command.

&mem update statType val?

Used to update individual member values.

See statType description below for options, some are a bit trickier then others though, like:

  • elixir = comma separated elixir short names, like &mem update elixir conc,life,fury Use &mem consumables for a full list of usable elixirs.
  • country = 2 letter ISO code.
  • ar = additional renown, like the 5 you can get from region renown.
  • prove = url for an image you want to use as proof.

Also, party related options will be ignored by this command, see &mem update other for that.

statType: Valid values = fam, family, familyname, char, character, charactername, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, axe, partyname, party, partylead, partyleader, name, names, consumable, elixir, elixirs, pa, paparty, birth, born, birthday, birthdate, country, horse, trial, trialdate, hiddenap, hiddenaap, hiddendp, hiddenaccuracy, hiddenacc, hiddenevasion, hiddeneva, hiddendamagereduction, hiddendr, verification, verify, proof, prove, set, horseset, hp, health, succ, succession

val?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem update familyName charName charClass charLevel charAp charAap charDp acc? eva? dr?

Just lets you update most values in one go.

familyName: Text/Any. Multiple words must be encased in quotes ""

charName: Text/Any. Multiple words must be encased in quotes ""

charClass: Text/Any. Multiple words must be encased in quotes ""

charLevel: Number.

charAp: Number.

charAap: Number.

charDp: Number.

acc?: Optional. Number.

eva?: Optional. Number.

dr?: Optional. Number.

&mem update other member statType val

The officer version of &mem update, just add a memberId as the first parameter to update a members individual values.

In addition to the other type of values this can be used to update party, partylead, and paparty.

member: Valid values = InternalId, member name, or @mentionMember

statType: Valid values = fam, family, familyname, char, character, charactername, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, axe, partyname, party, partylead, partyleader, name, names, consumable, elixir, elixirs, pa, paparty, birth, born, birthday, birthdate, country, horse, trial, trialdate, hiddenap, hiddenaap, hiddendp, hiddenaccuracy, hiddenacc, hiddenevasion, hiddeneva, hiddendamagereduction, hiddendr, verification, verify, proof, prove, set, horseset, hp, health, succ, succession

val: Text/Any. Multiple words must be encased in quotes ""

&mem update other member familyName charName charClass charLevel charAp charAap charDp acc? eva? dr?

Just lets you update most values in one go for other members.

member: Valid values = InternalId, member name, or @mentionMember

familyName: Text/Any. Multiple words must be encased in quotes ""

charName: Text/Any. Multiple words must be encased in quotes ""

charClass: Text/Any. Multiple words must be encased in quotes ""

charLevel: Number.

charAp: Number.

charAap: Number.

charDp: Number.

acc?: Optional. Number.

eva?: Optional. Number.

dr?: Optional. Number.

&mem update hidden hiddenStatType number?

Used to update individual hidden values, those not displayed with your regular stats.

hiddenStatType: Valid values = ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction

number?: Optional. Number.

&mem update other hidden member hiddenStatType number

The officer version of &mem update hidden, works the same way, you just add the memberId as the first parameter and it wont ask for the value if it is missing.

member: Valid values = InternalId, member name, or @mentionMember

hiddenStatType: Valid values = ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction

number: Number.

&mem update custom questionId answer?

Update a specific custom &mem update question

Optionally supply your answer directly with the second parameter, if only qustionId is set the question will be asked interactivly

questionId: Number.

answer?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem set image url

Patreon tier 4 reward.

Normally your discord image is displayed in your &mem info, this lets you change it.

url: Text/Any. Multiple words must be encased in quotes ""

&mem set url url

Patreon tier 5 reward.

Normally your url is directed at canute.gg, this lets you change it.

url: Text/Any. Multiple words must be encased in quotes ""

&mem proof url?, &mem prove url?, &mem verify url?, &mem verification url?

Used to attach an image to a members info, can be used to verify gear or whatever. Do &mem proof none to remove it again.

If you copy-paste an image to discord to upload it with this command, it will use the URL from Discords CDN. Note that if the image is removed from the channel this will stop working.

url?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem kick member

Kick someone from the bot and tag them as passive in the database

Bot keeps track of who is still an active member or not with the member role, but if you want to tag someone as passive in the database you can do so with this command.

member: Valid values = InternalId, member name, or @mentionMember

&mem activate passiveMember

Tag someone as active in the database

Opposite of the &mem kick command, it will activate someone in the database again.

passiveMember: Valid values = InternalId or @mentionMember

&mem delete member

Completely remove a member from the database

Will remove all attendance data, all gear progress logs and member info. Like they never existed at all! This command requires that you confirm before it actually does anything.

member: Valid values = InternalId or @mentionMember

&mem away

Will ask you for a from and to date, and tag you as away for that period.

Nodewars created in the period you are tagged as away will automatically register you as away too.

&mem away fromDate toDate?

Register yourself as away.

fromDate: Date format defaults to dd.MM.yyyy, but can be configured

toDate?: Optional. Date format defaults to dd.MM.yyyy, but can be configured

&mem away amount dateModifier

Register yourself as away, with just an amount of days or weeks etc.

Used like &mem away 14 days will register you as away from today's date to 14 days in the future.

amount: Number.

dateModifier: Valid values = day, days, week, weeks, month, months, year, years

&mem away member amount dateModifier

Register someone else as away with amount amount/modifier

member: Valid values = InternalId, member name, or @mentionMember

amount: Number.

dateModifier: Valid values = day, days, week, weeks, month, months, year, years

&mem away member fromDate toDate

Register someone else as away with set from/to date

member: Valid values = InternalId, member name, or @mentionMember

fromDate: Date format defaults to dd.MM.yyyy, but can be configured

toDate: Date format defaults to dd.MM.yyyy, but can be configured

&mem away reason member reason

Register an away reason shown while a member is away

Use " " Around the reason, like &mem away reason memberId "Holiday trip for 2 weeks". Can be removed again by doing &mem away reason memberId none

member: Valid values = InternalId, member name, or @mentionMember

reason: Text/Any. Multiple words must be encased in quotes ""

&mem back

Tag yourself as back from being away

&mem back member

Register someone else as back from being away.

member: Valid values = InternalId, member name, or @mentionMember

&mem trial member amount dateModifier

Register trial date for member

member: Valid values = InternalId, member name, or @mentionMember

amount: Number.

dateModifier: Valid values = day, days, week, weeks, month, months, year, years

&mem trial member trialDate

Register trial date for member by settings the date directly

member: Valid values = InternalId, member name, or @mentionMember

trialDate: Text/Any. Multiple words must be encased in quotes "" Can be removed by setting it to 'none'.

&mem list statType? alternative?

Get sorted stats

top and class can be further filtered on class, party can be filtered on the different party names, and attendance can be filtered on member, as in the memberId, name or @memberMention

statType?: Optional. Valid values = fam, family, familyname, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, gs, gearscore, axe, partyname, party, away, gone, top, name, names, attendance, consumable, elixir, elixirs, pa, paparty, birth, born, birthday, birthdate, country, horse, trial, trialdate, memberid, id, applications, hp, health, succ, succession, proof, prove, verify, verification

alternative?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem list passive statType? alternative?

Get sorted stats on passive members

Works the same way as the regular list command but will only get passive members form the database

statType?: Optional. Valid values = fam, family, familyname, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, gs, gearscore, axe, partyname, party, away, gone, top, name, names, attendance, consumable, elixir, elixirs, pa, paparty, birth, born, birthday, birthdate, country, horse, trial, trialdate, memberid, id, applications, hp, health, succ, succession, proof, prove, verify, verification

alternative?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem list node dateFrom? dateTo? eventType?

Gets attendance count for nodewars in period

dateFrom?: Optional. Date format defaults to dd.MM.yyyy, but can be configured

dateTo?: Optional. Date format defaults to dd.MM.yyyy, but can be configured

eventType?: Optional. Valid values = nw, nodewar, siege, wagon, tribute, boss, guildboss, training, fun

&mem list where customCriteria statType? alternative?

Gets list of members filtered on custom criteria, like "Ap > 300 && dp > 300 && CharacterLevel < 62"

customCriteria must be enclosed by double quotes. And the property names you check against are case sensitive, for now you can only check against int values, these are CharacterLevel, Ap, Aap, Dp, Gearscore, Accuracy, Evasion, DamageReduction, PaParty, AxeLevel, Hp, DaysActive, HiddenAp, HiddenAap, HiddenDp, HiddenAccuracy, HiddenEvasion, HiddenDamageReduction. Comparisons you can do are Equals as ==, NotEquals as !=, Above as >, Below as <, AboveOrEqual as >=, BelowOrEqual as <=. These can be combined with And as &&, and/or Or as ||.

customCriteria: Text/Any. Multiple words must be encased in quotes ""

statType?: Optional. Valid values = fam, family, familyname, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, gs, gearscore, axe, partyname, party, away, gone, top, name, names, attendance, consumable, elixir, elixirs, pa, paparty, birth, born, birthday, birthdate, country, horse, trial, trialdate, memberid, id, applications, hp, health, succ, succession, proof, prove, verify, verification

alternative?: Optional. Text/Any. Multiple words must be encased in quotes ""

&mem info member?

Get member info

Returns the member info displayed whenever someone does &mem update

member?: Optional. Valid values = InternalId, member name, or @mentionMember

&mem application discordMention

View application answers

Since applications are supposed to work for non members as well the discordMention parameter must either be an @mention, or just the discord name of the person, not the internal memberId since they may not be a member while applying.

discordMention: Text/Any. Multiple words must be encased in quotes ""

&mem avg

Get guild averages

&mem find name

Find member by their character, family or discord name

name: Text/Any. Multiple words must be encased in quotes ""

&mem consumables

List available elixirs

&mem elixirs partyName? nodewarId?

View elixirs for party, or party in a nodewar.

partyName?: Optional. Text/Any. Multiple words must be encased in quotes ""

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

&mem add elixir elixir

Add specific elixir

You can either use the id or short/long name of the elixir displayed in &mem consumables

elixir: Text/Any. Multiple words must be encased in quotes ""

&mem remove elixir elixir

Remove specific elixir

You can either use the id or short/long name of the elixir displayed in &mem consumables

elixir: Text/Any. Multiple words must be encased in quotes ""

&mem remove all elixirs

Removes all elixirs

&mem flush cache

Flush member cache

If you for some reason think the data returned from the bot is wrong, you can try flushing your member cache and get fresh data from the database.

&mem apply

Can be customized by you to ask anyone questions.

Must be configured with the &com mem apply add command.

You can view who has responded with &mem list applications and view answers with &mem application @discordName

&mem remove application discordMention

Remove a persons application registered with &mem apply

discordMention: Text/Any. Multiple words must be encased in quotes ""

&mem list application ids

In the cases where you want to remove applications for people who have left the server you can use this to display their id and then use that with the remove application command

&mem list custom answers member?

If you want to remove answers to custom mem update questions you can find their ids with this

member?: Optional. Valid values = InternalId, member name, or @mentionMember

&mem remove other custom answer member answerId

Remove a custom mem update answer by its Id

member: Valid values = InternalId, member name, or @mentionMember

answerId: Number.

&mem remove all other custom answers member

Remove a members custom mem update answers

member: Valid values = InternalId, member name, or @mentionMember

&mem remove custom answer answerId

Remove a custom mem update answer you have registered by its Id

answerId: Number.

&mem remove all custom answers

Remove all custom mem update answers you yourself have registered

&mem dm message dmFilter dmFilterValue?

Send a Discord DM to your members

The party option only sends to those manually added to that party, not those placed in it for a particular nodewar.

message: Text/Any. Multiple words must be encased in quotes ""

dmFilter: Text/Any. Multiple words must be encased in quotes "" Valid values = all, party and class

dmFilterValue?: Optional. Text/Any. Multiple words must be encased in quotes "" Valid values depends on dmFilter, if party it expects one of your parties, if class it expects one of warrior, war, ranger, berserker, serker, zerker, sorceress, sorc, valkyrie, valk, wizard, wiz, witch, tamer, loli, musa, maehwa, ninja, kunoichi, kuno, darkknight, dark knight, dk, striker, mystic, lahn, archer, shai, guardian, hashashin, hash, nova, sage, corsair, cors, drakania, drak, witchzard.

&mem diff role

@Mention those with the member role but not in the database, and those in the database without the member role.

&mem announce member excludeOrInclude

Exclude/include a member from the nodewar announcement

member: Valid values = InternalId, member name, or @mentionMember

excludeOrInclude: Text/Any. Multiple words must be encased in quotes ""

&mem delete me

Delete all your data on all servers

Nodewar module

Main concepts

Arranging nodewars

Create a "nodewar message", which will let your members indicate if they can attend or not simply by clicking on the pluss or minus reaction.

Tracking attendance status

In addition to having your members sign on/off for a nodewar, you can also tag them as no show etc after the fact

Announcements

Nodewars can be manually or automatically announced with the &nw announce nodewarId command, which will ping those still undecided. Or you can DM members with different attendance statuses with &nw dm nodewarId undecided "Message about them not having signed up yet here!"

Waiting list

Nodewars can be "closed" for multiple reasons, either by the time being after the nodewar start, by you defining a max attendance count, or just manually closing it. Members signing up while the nodewar is closed will be placed on a waiting list, and if someone else signs off they will be automatically moved to Can, based on who has been waiting the longest. You can still change their attendance manually with the &nw can/cant/noshow/undecided/away nodewarId memberId command.

Validating attendance

Even though someone says they will attend doesn't really mean they actually will. Therefor you can register a unique password for each nodewar, open a period where the password is accepted and tell those who attended the password, then they can validate their attendance by registering it themselves.

Tracking nodewars stats

By ending a nodewar after it is done with the &nw update result won/lost/draw you also register the nodewars stats in the database, like how many attended out of the total members you had at the time, and their average gearscore.

Rate limits

Unfortunately because of how Discord works, attendance and the "nodewar message" can only be updated so often, you can find the current rate limits at the bottom of the "nodewar message".


Commands


&nw new

Create a new nodewar by having the bot ask you questions.

Will ask for a date by default. Questions can be further customized with the &com nw new add command.

&nw new date nodewarMessage? nodeId?

Create a new nodewar

date: Date format defaults to dd.MM.yyyy, but can be configured

nodewarMessage?: Optional. Text/Any. Multiple words must be encased in quotes "" Displayed in the nodewar message itself, but is disabled by default, have a look at &bot settings to enable it.

nodeId?: Optional. Number. The nodeId uses the same id as http://www.somethinglovely.net/bdo/, just find the node there and select it, then copy the id from the end of the URL.

&nw new today

Create a new nodewar today

&nw new tomorrow

Create a new nodewar tomorrow

&nw new dayofWeek

Create a new nodewar on the week of day specified

dayofWeek: Valid values = sunday, sun, monday, mon, tuesday, tue, wedensday, wed, thursday, thu, friday, fri, saturday, sat

&nw new date eventType

Create a new nodewar with a custom event type, see the &ev type commands for how to set them up.

date: Date format defaults to dd.MM.yyyy, but can be configured

eventType: Valid values = eventTypeId or name of the event type

&nw delete nodewar

Delete a nodewar

Will also remove attendance associated with the nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw list mandatory?

List nodewars

Mandatory true/false will filter the list on those nodewars registered with that value.

mandatory?: Optional. Boolean, true/false.

&nw list nodes

List what nodes you've had nodewars on

Tells you how many times you've gone for a specific node and the last time that was.

&nw reset nodewar

Reset the nodewar message

Will remove the message only, and it's reaction, then add it all back. Useful if something is wrong or you just want to move it.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw dm nodewar attendanceStatusString message

Send a DM message to members associated with a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

attendanceStatusString: Text/Any. Multiple words must be encased in quotes "" Valid values = undecided, away, can, cant, noshow and all

message: Text/Any. Multiple words must be encased in quotes ""

&nw announce nodewar message?

Ping undecided members of a nodewar

Can optionally have a message associated with it. It will be removed on the next announce.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

message?: Optional. Text/Any. Multiple words must be encased in quotes ""

&nw update date nodewar date

Updated a nodewars date

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

date: Date format defaults to dd.MM.yyyy, but can be configured

&nw update mandatory nodewar mandatory

Set if a nodewar is mandatory or not

Is by default not set, but can be set to true or false, will display so in the nodewar message and can be used as filter other places.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

mandatory: Boolean, true/false.

&nw update message nodewar nodewarMessage

Update the message displayed in the nodewar message

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

nodewarMessage: Text/Any. Multiple words must be encased in quotes "" Displayed in the nodewar message itself, but is disabled by default, have a look at &bot settings to enable it.

&nw update node nodewar nodeId

Set the node for the nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

nodeId: Number. The nodeId uses the same id as http://www.somethinglovely.net/bdo/, just find the node there and select it, then copy the id from the end of the URL.

&nw remove node nodewar

Removes the node for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw update result nodewar resultType

Set the nodewar result, and store it for later statistics.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

resultType: Valid values = won, win, victory, lost, loss, draw

&nw update type nodewar eventType

Update nodewar type

Not all nodewars are nodewars ^^

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

eventType: Valid values = nw, nodewar, siege, wagon, tribute, boss, guildboss, training, fun

&nw update custom type nodewar eventType

Update nodewar type with a custom event type

Not all nodewars are nodewars, and these are even less so.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

eventType: Valid values = eventTypeId or name of the event type

&nw update password nodewar nodewarPassword

Register a validation password for the nodewar

The Idea is that you can register a password for a nodewar, then later make it public and have your members validate their attendance by also registering it. Closing the nodewar with &nw update result won/lost/draw will display a list of who validated their attendance.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

nodewarPassword: Text/Any. Multiple words must be encased in quotes ""

&nw update limit nodewar limit

Set an upper attendance limit for the nodewar

Those signing up after the nodewar has reached it's limit will be placed on the waiting list.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

limit: Number.

&nw update announce channel nodewar channelId

Set it up so that upcoming auto announcements for this nodewar is done in another channel

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

channelId: Text/Any. Multiple words must be encased in quotes ""

&nw password public nodewar isPublic delayMinutes?

Open the attendance validation registration period

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

isPublic: Boolean, true/false.

delayMinutes?: Optional. Number.

&nw password nodewar yourPassword

Register your attendance validation password

The individual counter part to the &nw update password command. Used to validate your attendance if the nodewar has a password set.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

yourPassword: Text/Any. Multiple words must be encased in quotes ""

&nw proof nodewar url?, &nw prove nodewar url?, &nw verify nodewar url?, &nw verification nodewar url?

Register an image as proof

Can be used for whatever the guild want's, to verify gear/buffs etc

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

url?: Optional. Text/Any. Multiple words must be encased in quotes ""

&nw set password memberId nodewar

Set validation password for someone else

memberId: Text/Any. Multiple words must be encased in quotes ""

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw set passwords memberIds nodewar

Set the validation password for a comma separated list of members

memberIds: Text/Any. Multiple words must be encased in quotes ""

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw remove password memberId nodewar

Remove someones validation password

memberId: Text/Any. Multiple words must be encased in quotes ""

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw can nodewar memberId

Register someone as can for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw cant nodewar memberId

Register someone as cant for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw away nodewar memberId

Register someone as away for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw undecided nodewar memberId

Register someone as undecided for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw noshow nodewar memberId

Register someone as noshow for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw waiting nodewar memberId

Register someone as on the waiting list for a nodewar

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

memberId: Text/Any. Multiple words must be encased in quotes ""

&nw attendance nodewar

Get a list of a nodewars attendance

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw close nodewar

Manually close a nodewar

Those signing up after this will be placed on the waiting list.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw open nodewar

Open a manually closed nodewar

This is the reverse of &nw close nodewar, it will not open nodewars that are automatically closed for other reasons.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw here nodewar

@mention those still not on the voice channel.

Gets a diff on those who signed up, and those who are still not in the registered voice channel

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw sync nodewar

Will update the nodewars attendance with new members, those who are away etc.

New members without attendance will be added as undecided. Passive members will be removed. Members registered as away for the nodewars date will be set as away, members registered as away but no longer has a registered away date will be set as undecided.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw waiting fix nodewar

If the max attendance has been adjusted or too many are attending, this will either move people from waiting to can or from can to waiting depending on their last updated timestamp.

nodewar: Valid values = nodewarId, found by doing &nw list and looking at the Id column, or in the top right of the nodewar message.

&nw flush attendance cache

Empties the attendance cache

In cases where the attendance cache is not up to date, you can manually flush it so it's rebuilt the next time

&nw flush nodewar cache

Empties the nodewar cache

Shouldn't normally need this, but here it is just in case.

Party module

Main concepts

Priority

The sorting works by taking all your attending members then placing them one by one into a party that fits them, the priority is important since the one with the lowest number will be filled first, and if a member is placed there they will not be concider for another party even it that would fit them better.

Disabling auto sorting

Setting &nw update auto partyId false basically means that only Fill, Overflow and PA groups will be considered for the party, and every member must be manually placed with the &mem update other memberId party partyName command. Leaving auto sort disabled does not mean you can not manually placed members there though, they will just be placed there first before anyone is automatically sorted into the party.

Numbered parties

Setting the count to 0 or more then 1 means the party will get a number after it, members can also be manually placed in these parties, just match the party name with the number.

Evenly distributed

Some classes can be nice to evenly distribute amongs your parties, but do not that ever rule only applies for that party, and you cant have an even number of a certain class in all parties unless you only have one party type or do it manually. Also note that the code does some rounding when figuring out how many it can place of a class per party, so for certain combinations of "members with class" divided by "parties for party type" it might seem a bit weird.

The Unplaceables

If members are still left to sort after all the parties and have been concidered, they will be placed in this party, it is recommended that your last party enable Fill, so that they will at least be placed somewhere.

Placement rules

Because the sorting is somewhat magical when not explained, everyone is given a placement reason as below to at least indicate what happened.

  • A = Auto, member was placed by the auto rules.
  • M = Manual, member was manually placed by doing &mem update other memberId party partyName
  • E = Evenly distributed class, member has a class that the party type tries to distribute evenly among the parties created for this party type.
  • F = Fill, party had room for extra members and the party type allows for the rules to be ignored for the sake of filling up the parties.
  • U = Unplaceable, if there are members left over after all the parties are done they will be placed here.

Commands


&party list

Lists the current parties

Also displays the current order, and gives you ready made commands you can copy/paste.

&party info id

Returns the different party options

They are display as the command to set them, so you can copy paste it and change the value

id: Number.

&party new name

Create a new party, with the name you want

name: Text/Any. Multiple words must be encased in quotes ""

&party update name id name

Update existing party name

id: Number.

name: Text/Any. Multiple words must be encased in quotes ""

&party update size id size

Update party size

Granted, the most common sizes are 5 and 20, but you can set whatever if you want.

id: Number.

size: Number.

&party update count id count

Update party count

Let's you choose how many parties of this type you want.

id: Number.

count: Number.

&party update priority id priority

Update party priority

Determines the order which party types are sorted, lowest number first.

id: Number.

priority: Number.

&party update sort id direction property

Update party sorting

Before members are placed in this party type it will sort the remaining members according to this.

id: Number.

direction: Text/Any. Multiple words must be encased in quotes ""

property: Text/Any. Multiple words must be encased in quotes ""

&party update gs id gs

Update party gearscore

Only place members in the party if they have above this gearscore

id: Number.

gs: Number.

&party update ap id ap

Update party AP

Only place members in party if they have above this (AP+AAP/2)

id: Number.

ap: Number.

&party update dp id dp

Update party DP

Only place members in party if they have above this DP

id: Number.

dp: Number.

&party update class id classes

Update party class

Only place members in party if they have one of these classes

id: Number.

classes: Text/Any. Multiple words must be encased in quotes ""

&party update avg id classes

Update party avg class

If set it will make sure to distribute the players with this class evenly among the parties of this type.

id: Number.

classes: Text/Any. Multiple words must be encased in quotes ""

&party update pa classes id classes

Update party PA classes

Most guilds use Witch and Wizzards for PA, but some like including others as well, like Valk

id: Number.

classes: Text/Any. Multiple words must be encased in quotes ""

&party update pa id pa

Update party PA count

How many PA groups you want for the party type. Note that this is for this party type only, and not the whole guild.

id: Number.

pa: Number.

&party update auto id auto

Update party auto placement

Decided if the party type is manual only or allows automatic placement

id: Number.

auto: Boolean, true/false.

&party update fill id fill

Update party fill

If enabled the sorting logic will ignore all other rules and fill the party up with who ever is left to sort. This should be enabled for the last party type with the last priority so that they at least get placed somewhere.

id: Number.

fill: Boolean, true/false.

&party update elixir id elixir

Update party elixir priority

If you for some reason want to prioritize those with elixirs registered, you can.

id: Number.

elixir: Boolean, true/false.

&party update overflow id overflowRuleId

Update party overflow rule

Useful for manual only party types.

  • 1 = If the number of manually placed members exceed the party size, the one with the lowest gearscore will be released to the regular auto sorting.
  • 2 = works almost like 1, but overflowing members are placed in 'sibling' parties, like if FL1 is full, they will be placed in FL2 if they have space, then lastly released to auto sorting if there is no space. Members manually placed in a non numbered party will be filled in where there is space or released for auto sorting.

id: Number.

overflowRuleId: Number.

&party delete id

Delete a party type

Members manually placed in the party will have it removed.

id: Number.

&party update min id minAttendance

Min nodewar attendance requirement

The amount of members that needs to attend before this party type is used

id: Number.

minAttendance: Number.

&party update event type partyTypeId eventTypeId

Associate party type with a custom event type

When party types are associated with spesific custom event types, they are no longer used for the default party sorting and the custom event type will only use those party types associated with it.

partyTypeId: Number.

eventTypeId: Number.

Custom even type module

Main concepts

In the beginning there was only the concept of a nodewar, then later on you could give them different types, like siege, wagon etc, and this worked fine to just distinguish the different events, but they didn't really have any different rules, different times etc. This module will hopefully help with that, letting you create your own event types and customize the existing ones.

Nodewar types

The default nodewar types can still be used, but with this module you can create custom rules for them which will then be used instead. To adjust the existing nodewar type simply do &ev type add nameOfNodewarType and go from there. If you don't want to adjust the existing ones you can of course use any other name then those.

To use the customized types you can either do &nw new date nameOrIdOfEventType or create a nodewar like usual with &nw new date and then update the type with &nw update custom type nodewarId nameOrIdOfEventType

Event/Message options

You should find options for most if not all the different ways a nodewar could be customized in the &bot settings or with options on the specific nodewar, in some cases they will work as a default value for the event type, like you could say that all sieges are mandatory by adding a customized siege event type and then setting it's mandatory option to true. Or you could create a type called Sunday Madness with a max limit of 30 etc. etc.

Reactions

Unlike the regular nodewars where you have not been able to customize the reactions other then remove them, here you have to say which actions a event have, and which reactions those actions belong to. This is done with the &ev type update action reaction eventTypeName actionName command, which will ask you which reaction you want to use for the action and test if the bot can actually use it.

Do note that the bot can only use reactions that exists in the same server the bot is in, so if the reaction you want to use belongs to some emote server, it is highly unlikely that the bot will have access to it.

Party types

To customize the party types used for a specific event type all you need to do is create them as usual and update their event type id, the Id is displayed at the top left for the event type when you do &ev type info or &ev type list. When the party sorting is done the bot will then look for party types for that specific event type, if none exists it will use the default party setup if any.


Commands


&ev type add name

Registers a new event type, either cusomize the existing ones or make your own

name: Text/Any. Multiple words must be encased in quotes ""

&ev type list

Returns a list of the custom event types

&ev type info eventType

Returns the different options an event type can have, with examples on how to change them

eventType: Valid values = eventTypeId or name of the event type

&ev type delete eventType

Deletes an event type, does not affect nodewars

eventType: Valid values = eventTypeId or name of the event type

&ev type update name eventType name

Updates the name of the event type

Event type names must be unique, there is also logic trying to check if the name matches one of the existing nodewar types.

eventType: Valid values = eventTypeId or name of the event type

name: Text/Any. Multiple words must be encased in quotes ""

&ev type update type eventType type

Updates the nodewar type

If the custom event type was originally made with a different name then a existing nodewar type this command will register it as a customisation of that nodewar type and change the custom event type name to match the nodewar type

eventType: Valid values = eventTypeId or name of the event type

type: Valid values = nw, nodewar, siege, wagon, tribute, boss, guildboss, training, fun

&ev type update start eventType time

Set the default starting time for the event

eventType: Valid values = eventTypeId or name of the event type

time: Valid values = hour and minutes according to your registered locale, default should be HH:MM

&ev type update end eventType time

Set the default ending time for the event

eventType: Valid values = eventTypeId or name of the event type

time: Valid values = hour and minutes according to your registered locale, default should be HH:MM

&ev type update close eventType minutes

Sets the default time in minutes before the starting time signups closes for this event type

eventType: Valid values = eventTypeId or name of the event type

minutes: Number.

&ev type update message eventType message

Sets the default message showin in the event message

eventType: Valid values = eventTypeId or name of the event type

message: Text/Any. Multiple words must be encased in quotes ""

&ev type update behaviour eventType behaviour

Sets the announcement behaviour for this event type, it can either be none, day, or all

This adjusts when the attendance announcement is sent, all meaning all days before the event, and day meaning on the day of the event

eventType: Valid values = eventTypeId or name of the event type

behaviour: Valid values = none, never, ondate, day, alldays, all

&ev type update channel eventType channelId?

Set which channel announcements should be sent to

eventType: Valid values = eventTypeId or name of the event type

channelId?: Optional. Text/Any. Multiple words must be encased in quotes ""

&ev type update waiting eventType val

Set if the event type has a waiting list or not

eventType: Valid values = eventTypeId or name of the event type

val: Boolean, true/false.

&ev type update prioritize eventType val

Set if those on the waiting list should be prioritised by how many other events they have been on the waiting list for

eventType: Valid values = eventTypeId or name of the event type

val: Boolean, true/false.

&ev type update max eventType maxAttendanceCount

Set the default max attending count for this event type

eventType: Valid values = eventTypeId or name of the event type

maxAttendanceCount: Number.

&ev type update node eventType nodeId

Set the default node this event takes place

eventType: Valid values = eventTypeId or name of the event type

nodeId: Number. The nodeId uses the same id as http://www.somethinglovely.net/bdo/, just find the node there and select it, then copy the id from the end of the URL.

&ev type update initial eventType initialMessage

Register a initial announce message

eventType: Valid values = eventTypeId or name of the event type

initialMessage: Text/Any. Multiple words must be encased in quotes ""

&ev type update mandatory eventType val

Set if this event type is mandatory by default

eventType: Valid values = eventTypeId or name of the event type

val: Boolean, true/false.

&ev type remove mandatory eventType

Remove the mandatory option all together

eventType: Valid values = eventTypeId or name of the event type

&ev type update action reaction eventType action

Lets you customize which reaction should be used for the different actions

eventType: Valid values = eventTypeId or name of the event type

action: Valid values = none, signon, signup, signoff, signout, signups

&ev type update action position eventType action position

Updates the position the reaction should be in, from left to right

eventType: Valid values = eventTypeId or name of the event type

action: Valid values = none, signon, signup, signoff, signout, signups

position: Number.

&ev type remove action eventType action

Remove a reaction, maybe the members shouldn't be able to sign off?

eventType: Valid values = eventTypeId or name of the event type

action: Valid values = none, signon, signup, signoff, signout, signups

&ev type update display eventType nameOfOption val

Update the different display options in the event message, you can copy the option name from the &ev type info command.

eventType: Valid values = eventTypeId or name of the event type

nameOfOption: Text/Any. Multiple words must be encased in quotes ""

val: Boolean, true/false.

Bot settings module

A lot of info is also displayed with &bot settings. First of, you should probably enable developer mode in Discord, there's a good explanation of how you do that here https://discordia.me/developer-mode. The reason why is that a couple of the commands here require you to copy the Id the channel or message and you need developer mode to do that.


Commands


&bot auto setup

Creates a default set of roles and channels, should only be used the first time you are setting up the bot

&bot settings

Displays all your current settings.

Basically the main bread and butter for the &bot module.

&bot update gsCalc expression

Define your logic for how regular gearscore should be calculated. A members GS is updated the next time they do &mem update

expression must be enclosed by double quotes. And the property names you can use are case sensitive, these are CharacterLevel, Ap, Aap, Dp, Gearscore, Accuracy, Evasion, DamageReduction, PaParty, AxeLevel, Hp, DaysActive, HiddenAp, HiddenAap, HiddenDp, HiddenAccuracy, HiddenEvasion, HiddenDamageReduction. Operators you can use are Add as +, Subtract as -, Multiply as *, Divide as . These can be Enclosed by parentheses as ( and ) if needed.

expression: Text/Any. Multiple words must be encased in quotes ""

&bot update successionGsCalc expression

Define your logic for how succession gearscore should be calculated. A members GS is updated the next time they do &mem update

expression must be enclosed by double quotes. And the property names you can use are case sensitive, these are CharacterLevel, Ap, Aap, Dp, Gearscore, Accuracy, Evasion, DamageReduction, PaParty, AxeLevel, Hp, DaysActive, HiddenAp, HiddenAap, HiddenDp, HiddenAccuracy, HiddenEvasion, HiddenDamageReduction. Operators you can use are Add as +, Subtract as -, Multiply as *, Divide as . These can be Enclosed by parentheses as ( and ) if needed.

expression: Text/Any. Multiple words must be encased in quotes ""

&bot update name template template

Define your own template for how a members character and family name is displayed outside of tables

Remember to have quotes around the template, like &bot update name template "{{FamilyName}}/{{CharacterName}}". Valid placeholders are {{FamilyName}}, {{CharacterName}}, {{CharacterClass}}, and {{GearScore}}. Other then that you can decided the order and separators, if any. Note that Discord nicknames can at max be 32 characters long

template: Text/Any. Multiple words must be encased in quotes ""

&bot update nw mention message

Define the message before the nodewar message

Pings @everyone if no member role is set or if there is no roles with the exist permission. If one or more of those exists it will default to pinging the member roles, or use the message defined here. If you don't want any message at all when creating a nodewar you can do &bot update nw mention " " so it sends a blank message.

message: Text/Any. Multiple words must be encased in quotes ""

&bot update logchannel channelId?, &bot update log channel channelId?

Used to register the Discord channel the bot sends log and notification messages to.

If channelId is not supplied it will use the channel the command is run in. If the channel can not be mentioned it will try to find it by it's name.

channelId?: Optional. Text/Any. Multiple words must be encased in quotes ""

&bot update voice channelId

Registers the voice channel you use for nodewars.

This command basically only exists to register the channel used by the &nw here noedwarId command. Voice channels can generally not be @mentioned, so just use the name instead, or copy the Id from developer mode.

channelId: Text/Any. Multiple words must be encased in quotes ""

&bot update member role roleId

The role you assign your regular guild members.

This role gives access to regular commands, tagged as Member here. Run &help commands for a list of the default permissions. This role is also used to determine if the member should be active or not in the database.

roleId: Text/Any. Multiple words must be encased in quotes ""

&bot update officer role roleId

The role you assign your guild officers.

This role gives access to regular and officer commands, but does not determine guild membership, if someone is both a member and officer they need both roles.

roleId: Text/Any. Multiple words must be encased in quotes ""

&bot update time start end

When nodewars are held.

In case you need to adjust it for some reason, summer/winter time etc.

start: Text/Any. Multiple words must be encased in quotes ""

end: Text/Any. Multiple words must be encased in quotes ""

&bot update close minutes

How long (in minutes) before nodewar start time signups will close.

minutes: Number.

&bot update gear reminder amount modifier

How many days inbetween each gear update reminder

The bot will send a DM to those who has not updated their gear in the amount of days you define, but since I don't want this to be abused too much it will only accept 7 days or more. Modifier can be day/week/month/year or in plural, regardless, the input is saved as days, so &bot update gear reminder 2 weeks will result in 14 days.

amount: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

&bot update valid minutes

Default timespan for auto closing the validation period after a nodewar.

Registered in minutes, fires of a one time scheduled task when the password is made public, if the bot should happen to crash for some reason this job will not run.

minutes: Number.

&bot update message messageId

Auto message DM'ed to new members getting the registered Member role

You can enable Discord dev mode and copy the message id, use it with this command and the bot will copy that message for later use. You can find a little guide on how to enable Developer mode here https://discordia.me/developer-mode. Or just edit it on the website.

messageId: Text/Any. Multiple words must be encased in quotes ""

&bot update name val

Set Discord nickname equal to registered character (family) names

This is updated either after the member is updated or once an hour. Can be super buggy though, depending on Discord permissions, name length etc.

val: Boolean, true/false.

&bot update nw priority val

Enable/Disable waiting list priority

Prioritize those in the waiting list by previous nodewars. If someone is in the waiting list and was also on the waiting list for the previous nodewar they will be prioritized over the others in the waiting list for the current nodewar, the priority increases by the number of consecutive nodewars on the waiting list.

val: Boolean, true/false.

&bot update party role val

Have the bot manage party specific roles

The bot runs a job once an hour adding/removing members from party specific roles according to the party they are manually added too. The class is prefixed with P- to distinguish it from other roles.

val: Boolean, true/false.

&bot update partyleader role val

Have the bot manage party specific roles

Same as the &bot update party role, but will add and remove people from the P-PartyLeaders role, according to them being registered as a party leader or not.

val: Boolean, true/false.

&bot update class role val

Have the bot manage class specific roles

The bot runs a job once an hour adding/removing members from class specific roles according to the class they are registered with. The class is prefixed with C- to distinguish it from other roles.

val: Boolean, true/false.

&bot update announce val

Auto announce undecided for nodewars

Job runs at 16:00 every day and will @mention everyone that is undecided for all upcoming nodewars.

val: Boolean, true/false.

&bot get message

View the registered welcome message.

&bot remove message

Remove the registered welcome message.

&bot update nodewar message val

Customize what is displayed in the nodewar messages, and how certain aspects of the nodewar message behaves

By default the message will try to display everything, but you decide what to display with this command by doing for example &bot update nodewar message 1,5,10,15. That would only display 1 = The time in the title, 5 = Party name, 10 = Member class and 15 = Away list.

Each number represents one of the things in the message.

  • 1 = The time in the title
  • 2 = Avg GS in the title
  • 3 = Close time
  • 4 = Node info
  • 5 = Party Name
  • 6 = Party GS
  • 7 = Member Id
  • 8 = Member fullname, if missing just the character name will be shown, or family if option 19 is set
  • 9 = Member GS
  • 10 = Member Class
  • 11 = Member placement cause
  • 12 = PA group
  • 13 = Leader
  • 14 = Can't list
  • 15 = Away list
  • 16 = Undecided list
  • 17 = Count
  • 18 = Message
  • 19 = Use family names instead of character
  • 20 = Hide can reaction
  • 21 = Hide cant reaction
  • 22 = Hide signups reaction
  • 23 = Hide elixir reaction
  • 24 = Hide command info reaction
  • 25 = Disable auto waiting list after nodewar start
  • 26 = Only announce todays nodewar

Hiding reactions requires &nw reset nodewarId to be run for it to update.

So if you just want to remove the party avg gearscore you do:

&bot update nodewar message 1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17 Leaving out 6.

val: Text/Any. Multiple words must be encased in quotes ""

&bot leave

Make the bot leave this Discord server

Instead of just right click -> kick.

&bot list officers

Returns a list of those the bot has registered as officer, these will have access to the website.

&bot officer add member

Add member as officer, without using the Discord role.

member: Valid values = InternalId, member name, or @mentionMember

&bot officer remove member

Remove member as individual officer.

Will not affect the role, if the member still has the Officer role, they will still have officer rights.

member: Valid values = InternalId, member name, or @mentionMember

&bot officer remove passive memberDiscordId

Same as &bot officer remove, but takes the discord id and does not care about the member being active in the database

memberDiscordId: Text/Any. Multiple words must be encased in quotes ""

&bot countries codeOrName?

Will return a list of the possible countries in the database and their 2 letter ISO code, these can be used with the &mem update country command.

codeOrName?: Optional. Text/Any. Multiple words must be encased in quotes ""

&bot nodes nodeOrRegion?

Will return a list of the possible nodes in the database, their region and their Id on http://www.somethinglovely.net/bdo/, these can be used with the &nw update node command.

nodeOrRegion?: Optional. Text/Any. Multiple words must be encased in quotes ""

&bot debug website access

Will try to figure out why you don't have admin rights on the website

&bot mem info options

Displays how the mem info embed is currently configured

&bot mem info display name val

Turn one of the options in the mem info embed on or off

name: Text/Any. Multiple words must be encased in quotes ""

val: Boolean, true/false.

&bot update timezone

Register the timezone you want, and the bot will try to do things according to that time.

&bot update culture

Register the culture you want, it is currently only used for parsing/displaying dates

&bot time

Will return the local time of the bot and what it thinks the time in the registered timezone is

&bot knows guild

The bot is supposed to keep track of which Discord servers it is active in, or has left, with this you can check if it noticed that it joined yours

This is for example used the determine which guilds are used in scheduled tasks

&bot delete server data

Delete all data in the bot assoiciated with this server.

Export module

If you for some reason feel the need to dump the data from the bot into some spreadsheets or something you can export them to .csv files.


Commands


&export members

Exports your registered members to a .csv file.

&export all member progress

Exports all member progress

&export nodewars mandatory?

Exports your registered nodewars to a .csv file.

The optional parameter mandatory takes true/false and will filter the registered nodewars on mandatory/no mandatory nodewars if registered as such.

mandatory?: Optional. Boolean, true/false.

&export attendance nodewarId includeUpdateTimestamps?

Exports your registered attendance to a .csv file per nodewar.

You can choose to display update timestamps by adding doing &export attendance nodewarId true.

nodewarId: Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

includeUpdateTimestamps?: Optional. Boolean, true/false.

&export attendance from to

Exports your registered attendance to a .csv for nodewars in the period

from: Date format defaults to dd.MM.yyyy, but can be configured

to: Date format defaults to dd.MM.yyyy, but can be configured

&export parties nodewarId column?

Exports a nodewars attendees per party to a .csv file.

Can optionally take id/char/fam to have it only return those columns. Do note that parties are "calculated" each time attendance is changed, so this can change a lot.

nodewarId: Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

column?: Optional. Text/Any. Multiple words must be encased in quotes ""

&export answers answerType?

Exports members custom question answers to a .csv file.

Will by defaul return &mem update questions, and can optionally return application answers by adding 2 as the type parameter

answerType?: Optional. Number.

Graph module

It's all fun and games until someone pulls out the graphs.


Commands


&graph growth year? graphType?

Graph displaying how many members joined per month, minus how many members left per month (and are still passive)

year?: Optional. Number.

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph gear memberId?

Radar graph displaying most important gear stats for member or guild avg

memberId?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph gs nodewarId? graphType?

Graph displaying members by their Gearscore.

Counts members in intervals of 10. Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph class nodewarId? graphType?

Graph displaying members by their class.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph horse nodewarId? graphType?

Graph displaying members by what horse they have registered.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph level nodewarId? graphType?

Graph displaying members by what level they are.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph axe nodewarId? graphType?

Graph displaying members by what axe they have registered.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph nw days memberId? graphType?

Graph displaying what day of the week has the best attendance.

Optional parameter memberId can be used to filter it on a specific member.

memberId?: Optional. Text/Any. Multiple words must be encased in quotes ""

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph nw result

Pie graph displaying your nodewar results.

&graph nw nodes

Bar graph displaying the 5 most visited nodes

&graph age nodewarId? graphType?

Graph displaying members by their age.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph country nodewarId? graphType?

Graph displaying members by their country.

Optional parameter nodewarId can be used to filter it on a specific nodewar.

nodewarId?: Optional. Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

&graph member gs memberId

Line graph displaying member gearscore progress

This is registered once each morning, depending on there being changes. Wait until tomorrow is today's change is not showing.

memberId: Text/Any. Multiple words must be encased in quotes ""

&graph nw gs warsToTake?

Line graph displaying Gearscore for the last 20 nodewars

Use the parameter warsToTake to adjust how many wars you want included.

warsToTake?: Optional. Number.

&graph nw att warsToTake?

Line graph displaying attendance for the last 20 nodewars

Use the parameter warsToTake to adjust how many wars you want included.

warsToTake?: Optional. Number.

&graph nw signup nodewarId graphType?

Graph displaying attendance status for a nodewar.

nodewarId is not optional for this one.

nodewarId: Number. The id of the nodewar, you can find it in the top left of the nodewar message or by doing &nw list

graphType?: Optional. Text/Any. Multiple words must be encased in quotes ""

Permissions module

The bot has a default set of permission set by the officer and member roles you set up in the bot settings, but in addition to those you can set up custom permissions here.

The permission are set by allowing or denying a user or role, by matching the beginning of a command, so denying the command "&mem info ", with the space at the end will deny someone from looking up others information, but still allow them to view their own. Remember to include the "&" at the beginning.

Command text Requires " around it, like "&mem info".

Bot owner(me), Guild owners and administrators can not be locked out, they will allways be allowed to run a command, but other then that the role permissions are evaluated in the order they have in the Discord servers Role settings, individual command permissions are evaluated before these and will always be in the order of deny then allow.

If you don't set the default officer/member roles in &bot settings, you can do custom default permissions by allowing botOfficer, botMember, exist or webOfficer for your Discord roles with &perm allow role @yourRole botOfficer etc.


Commands


&perm list

Returns a list of the registered permissions.

&perm allow idType memberOrRoleId command

Define a rule allowing someone to run a command. Or custom role permissions.

Takes either role or user as IdType for commands, then you need to mention that member or role, before defining the command to match against.\nExample: &perm allow user @someMember "&mem away" will allow that member themselves as away. In this particular example you would probably deny "&mem away " with the space at the end so they are not allowed to register others as away.

Instead of a command you can also use botOfficer, botMember, exist or webOfficer, to specify that a role should have the default officer command permissions (botOfficer), the default member command permissions (botMember), can be active in the database and have member access to the website (exist), or have officer permissions on the website (webOfficer). Do note that these can only be given to roles.

idType: Text/Any. Multiple words must be encased in quotes ""

memberOrRoleId: Text/Any. Multiple words must be encased in quotes ""

command: Text/Any. Multiple words must be encased in quotes ""

&perm deny idType memberOrRoleId command

Define a rule denying someone to run a command.

Takes either role or user as IdType, then you need to mention that member or role, before defining the command to match against. Example: &perm deny role @yourMemberRole "&mem info " will deny your members from viewing others detailed info.

idType: Text/Any. Multiple words must be encased in quotes ""

memberOrRoleId: Text/Any. Multiple words must be encased in quotes ""

command: Text/Any. Multiple words must be encased in quotes ""

&perm remove permissionId

Remove a custom permission.

Use the &perm list command to find the Id's.

permissionId: Number.

Task module

You can use the task module to configure the schedule for some of the bots automated tasks yourself. The modifier param can take once, hour, day, week, month and year. So say you want to change the nodewar announcement to run at 17:00 you can do: &task add attendance 17 0 1 day.

If you don't care at what time the task is run but just want it to run every hour you can do: &task add attendance 0 0 1 hour. It will then run every hour dependent on when you added the task or when the bot was last started.


Commands


&task list

Get a list of your registered scheduled tasks

&task list running

Get a list of the actual schedule for your tasks, some tasks may be listed twice, as in the next time it will be run, and the next time it will be repeated.

&task add birthday hour minute repeat modifier

Add your own schedule for when the birthday announcement job should be run. Defaults to 9 in the morning, once a day.

hour: Number.

minute: Number.

repeat: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

&task add attendance hour minute repeat modifier

Want to run the attendance announcement every damned hour? Now you can! Defaults to 16:00, once a day.

I would still recommend maybe only running it twice or so a day, you can add the same job multiple times if you say want to run it at 16:00 and 17:00.

hour: Number.

minute: Number.

repeat: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

&task add trial hour minute repeat modifier

Set when the trial reminder should be run, it will still only remind people on the day of question, and only once, but now you can set when. Defaults to 15:50.

hour: Number.

minute: Number.

repeat: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

&task add gear hour minute repeat modifier

Will still only DM members as often as is configured in the bot settings, and that has a 7 day minimum, but you can decide when to run it. Defaults to 15:30.

hour: Number.

minute: Number.

repeat: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

&task add custom hour minute repeat modifier message channel?

Will send a the message you set to the registered log channel or the channel you decide

hour: Number.

minute: Number.

repeat: Number.

modifier: Text/Any. Multiple words must be encased in quotes ""

message: Text/Any. Multiple words must be encased in quotes ""

channel?: Optional. Text/Any. Multiple words must be encased in quotes ""

&task add nodewar hour minute dayOfWeek

Adds a task that automatically creates new nodewars in the channel up to a week ahead.

Nodewar will be created in the channel you run the command. Task is run every day at the time you define. Will not create a nodewar when the task is run on the day you defined, or when there already is a nodewar created for the day defined in the channel. Say you add a task that runs 1 in the morning for mondays, when there already is a nodewar in the channel it will then create a nodewar for the next monday on the tuesday after the current monday nodewar.

hour: Number.

minute: Number.

dayOfWeek: Valid values = sunday, sun, monday, mon, tuesday, tue, wedensday, wed, thursday, thu, friday, fri, saturday, sat

&task remove id

Will remove the schedule, from the DB and the cancel the current running ones. Use &task list for a list of Id's you can use with this command.

id: Number.

&task add discord role job

No fuss, just run the job updating discord roles in the database now.

Self role module

Commands


&role self roleId

Add/remove roles with reactions

You need to be able to @mention the role to use this. Will add a message with a plus and minus reaction, which members of your Discord can use to remove or add a role to themselves.

roleId: Text/Any. Multiple words must be encased in quotes ""

&role list roleType?

roleType?: Optional.

Custom command module

Main concepts

Customizable commands

&mem update, &mem apply, &nw new can be customized with additional questions. &mem apply has no default questions so it is completely up to you how you want to use it, results can be viewed with &mem list applications and &mem application.

Default questions

&mem update and &nw new both have default questions, which can be customized by adding a question with their updateType and, and then setting the position/question, it will then be used instead of the default, but removing them will only revert back to the default.

Required questions

In short, the default questions are required, since they are used by other functionality in the bot, like the party sorting.

Position

Position starts at 1, but does not account for the default questions, so for &mem update you probably want to start your own questions at 8, and &nw update at 2.

UpdateType

The memberTypeToUpdate and nodewarTypeToUpdate parameters includes options for both member and nodewars, but they will not mix, you can add a question for AP to a nodewar, it will be asked, but it will not be used.


Commands


&com mem update add question memberTypeToUpdate position?

Add question to &mem update

question: Text/Any. Multiple words must be encased in quotes ""

memberTypeToUpdate: Valid values = custom, fam, family, familyname, char, character, charactername, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, axe, consumable, elixir, elixirs, birth, born, birthday, birthdate, country, horse, hiddenap, hiddenaap, hiddendp, hiddenaccuracy, hiddenacc, hiddenevasion, hiddeneva, hiddendamagereduction, hiddendr, verification, verify, proof, prove, nodewarmessage, node, mandatory, type, password, closed, hp, health, succ, succession, max, date

position?: Optional. Number.

&com mem apply add question position?

Add question to &mem apply

question: Text/Any. Multiple words must be encased in quotes ""

position?: Optional. Number.

&com nw new add question nodewarTypeToUpdate position?

Add question to &nw new

question: Text/Any. Multiple words must be encased in quotes ""

nodewarTypeToUpdate: Valid values = custom, fam, family, familyname, char, character, charactername, class, classes, level, lvl, ap, aap, awakened, awakenedap, awakening, awakeningap, awap, dp, accuracy, acc, eva, evasion, dr, damagereduction, axe, consumable, elixir, elixirs, birth, born, birthday, birthdate, country, horse, hiddenap, hiddenaap, hiddendp, hiddenaccuracy, hiddenacc, hiddenevasion, hiddeneva, hiddendamagereduction, hiddendr, verification, verify, proof, prove, nodewarmessage, node, mandatory, type, password, closed, hp, health, succ, succession, max, date

position?: Optional. Number.

&com mem apply list

View custom questions for &mem apply

&com mem update list

View custom questions for &mem update

&com nw new list

View custom questions for &nw new

&com delete questionId

Delete a question

Use the id from the list commands

questionId: Number.

&com update question questionId questionText

Update question text

Use the id from the list commands

questionId: Number.

questionText: Text/Any. Multiple words must be encased in quotes ""

&com update position questionId position

Update question position

Use the id from the list commands

questionId: Number.

position: Number.

Notifications module

Let's you control what notifications the bot sends to the registered notification channel. Use &notif list for the current list of notifications and their id's, then you can use those id's with &notif update notificationTypeId trueOrFalse.


Commands


&notif list

Returns a list of every notification and if it is enabled or not

&notif update notificationTypeId trueOrFalse

Updates the chosen notification, use &notif list for a list of the current notifications.

notificationTypeId: Number.

trueOrFalse: Boolean, true/false.

Privacy

Statement

Discord bots are required by Discords terms and conditions to provide and adhere to a privacy policy. Do note that this bot is maintained by a one man show, and that I personally want to store as little about you as possible, which is mostly motivated by me not wanting to deal with issues like this very privacy statement.

What Canute stores and why it does it

In addition to the data you provide to the bot, the bot stores unique Discord identifiers, these are:

  • Person Id's are used to identify a person when they are @mentioned in commands, when they use the reactions to indicate their attendance, and when the bot is used to DM members. They are also used for the sign in process on the website by matching the Id given from Discord to the website during log in with the data registered in the database.
  • Person name and discriminator is used in notifications, most often that information is gotten straight from the Discord API as needed, but in some cases that is not practical.
  • Server Id is used to associate all your data to your specific server, this is the reason one server can't randomly view another servers data.
  • Server name is stored so that it can be displayed again on the website.
  • Channel Id's are used to figure out in which channel a nodewar message should be posted, and in which channels attendance announcements should be sent.
  • Message Id's are stored to make the nodewar message possible. So that the bot is able to restart, and figure out which reactions it is supposed to process attendance for based on which message the reaction was related to. This is also how the self assignable role message works.
  • Role Id's are used to figure out which roles the bot should use while managing party/class related roles. And which roles the bot should check against for permissions in the bot.

Optional personal information

  • Country is used in lists and graphs, purely as trivia.
  • Birthdate is used in lists and graphs, and optionally a birthday notification can be enabled which will @mention the registered officer role with a list of which members have registered a birthday on that day.

Since birthdates and countries are associated with a persons unique Discord Id it is then technically defined as data which can be combined with other datasets to identify a person, for this to be relevant it would require the data to be shared in the first place, but please keep this in mind before using this functionality.

Sharing of data

Data is generally not shared, the bot uses a third party for system logs, which contain data for debugging purposes. The debugging data is only available to me, and only for 2 weeks.

Changes to this Privacy policy

This may be changed at any time, but changes will be mentioned in the Patch notes in the bot's own Discord server.

Contact and removal

Please contact me on Discord (Lam#6960) if there are any questions, or you want me to delete your data.

Patreon

It is greatly apreciated if you consider becoming a Patreon :) It helps me finance the bot, and gives you some perks :)

Patreon

The integration expects you to be a member of the Discord first. It works by the Patreon bot setting the role on that discord, then Alfred (a simple bot for that discord) will notice that and update the database, the patreon tier will be used in the bot. If for some reason this doesn't work, please don't hesitate to contact me, and I'll get it sorted!