added minRaasEntries and voteWinnerBroadcastMessage options

This commit is contained in:
Davide Fantino 2022-10-21 00:48:57 +02:00
parent 5b09c79881
commit 8ffad658ae
2 changed files with 64 additions and 7 deletions

View File

@ -119,6 +119,13 @@ If set to true the blacklisted layers will be filtered out also in whitelist mod
```json ```json
true true
``` ```
#### minRaasEntries
###### Description
Minimum amount of RAAS layers in the vote list.
###### Default
```json
2
```
#### hideVotesCount #### hideVotesCount
###### Description ###### Description
Hides the number of votes a layer received in broadcast message. Hides the number of votes a layer received in broadcast message.
@ -138,7 +145,14 @@ false
Message that is sent as broadcast to announce a vote. Message that is sent as broadcast to announce a vote.
###### Default ###### Default
```json ```json
"✯ MAPVOTE ✯ Vote for the next map by writing in chat the corresponding number!" "✯ MAPVOTE ✯\nVote for the next map by writing in chat the corresponding number!"
```
#### voteWinnerBroadcastMessage
###### Description
Message that is sent as broadcast to announce the winning layer.
###### Default
```json
"✯ MAPVOTE ✯\nThe winning layer is\n\n"
``` ```
#### allowedSameMapEntries #### allowedSameMapEntries
###### Description ###### Description
@ -204,9 +218,11 @@ Array of timeframes that allows to override options based on local time. See exa
"layerLevelBlacklist": [ "BlackCoast_Seed" ], "layerLevelBlacklist": [ "BlackCoast_Seed" ],
"layerLevelWhitelist": [ "Yeho", "Gorodok", "Mutaha", "Narva", "Tallil" ], "layerLevelWhitelist": [ "Yeho", "Gorodok", "Mutaha", "Narva", "Tallil" ],
"applyBlacklistToWhitelist": true, "applyBlacklistToWhitelist": true,
"minRaasEntries": 2,
"hideVotesCount": false, "hideVotesCount": false,
"showRerollOption": false, "showRerollOption": false,
"voteBroadcastMessage": "✯ MAPVOTE ✯ Vote for the next map by writing in chat the corresponding number!", "voteBroadcastMessage": "✯ MAPVOTE ✯\nVote for the next map by writing in chat the corresponding number!",
"voteWinnerBroadcastMessage": "✯ MAPVOTE ✯\nThe winning layer is\n\n",
"allowedSameMapEntries": 1, "allowedSameMapEntries": 1,
"logToDiscord": true, "logToDiscord": true,
"channelID": "112233445566778899", "channelID": "112233445566778899",

View File

@ -90,6 +90,11 @@ export default class MapVote extends DiscordBasePlugin {
description: 'if set to true the blacklisted layers won\'t be included also in whitelist mode', description: 'if set to true the blacklisted layers won\'t be included also in whitelist mode',
default: true default: true
}, },
minRaasEntries: {
required: false,
description: 'Minimum amount of RAAS layers in the vote list.',
default: 2
},
hideVotesCount: { hideVotesCount: {
required: false, required: false,
description: 'hides the number of votes a layer received in broadcast message', description: 'hides the number of votes a layer received in broadcast message',
@ -105,6 +110,11 @@ export default class MapVote extends DiscordBasePlugin {
description: 'Message that is sent as broadcast to announce a vote', description: 'Message that is sent as broadcast to announce a vote',
default: "✯ MAPVOTE ✯\nVote for the next map by writing in chat the corresponding number!" default: "✯ MAPVOTE ✯\nVote for the next map by writing in chat the corresponding number!"
}, },
voteWinnerBroadcastMessage: {
required: false,
description: 'Message that is sent as broadcast to announce the winning layer',
default: "✯ MAPVOTE ✯\nThe winning layer is\n\n"
},
allowedSameMapEntries: { allowedSameMapEntries: {
required: false, required: false,
description: 'Allowed NUMBER of duplicate map entries in vote list', description: 'Allowed NUMBER of duplicate map entries in vote list',
@ -404,14 +414,15 @@ export default class MapVote extends DiscordBasePlugin {
} }
} }
} }
const nextMap = randomElement(cpyWinners);
if (!skipSetNextMap) { if (!skipSetNextMap) {
const nextMap = randomElement(cpyWinners);
const baseDataExist = this && this.server; const baseDataExist = this && this.server;
const layerDataExist = this.server.nextLayer && this.server.nextLayer.layerid; const layerDataExist = this.server.nextLayer && this.server.nextLayer.layerid;
if (baseDataExist && (!layerDataExist || this.server.nextLayer.layerid != nextMap)) if (baseDataExist && (!layerDataExist || this.server.nextLayer.layerid != nextMap))
this.server.rcon.execute(`AdminSetNextLayer ${nextMap}`); this.server.rcon.execute(`AdminSetNextLayer ${nextMap}`);
else console.log("[MapVote][1] Bad data (this/this.server). Next layer not set to prevent errors."); else console.log("[MapVote][1] Bad data (this/this.server). Next layer not set to prevent errors.");
} }
return nextMap;
} }
matchLayers(builtString) { matchLayers(builtString) {
@ -483,8 +494,9 @@ export default class MapVote extends DiscordBasePlugin {
) )
); );
for (let i = 1; i <= maxOptions; i++) { for (let i = 1; i <= maxOptions; i++) {
let l, maxtries = 10; const needMoreRAAS = !bypassRaasFilter && rnd_layers.filter((l) => l.gamemode === 'RAAS').length < this.options.minRaasEntries;
do l = randomElement(all_layers); while ((rnd_layers.find(lf => lf.layerid == l.layerid) || rnd_layers.filter(lf => lf.map.name == l.map.name).length > (this.options.allowedSameMapEntries - 1)) && --maxtries >= 0) let l, maxtries = 20;
do l = randomElement(needMoreRAAS ? all_layers.filter((l) => l.gamemode.toLowerCase() == "raas") : all_layers); while ((rnd_layers.find(lf => lf.layerid == l.layerid) || rnd_layers.filter(lf => lf.map.name == l.map.name).length > (this.options.allowedSameMapEntries - 1)) && --maxtries >= 0)
if (maxtries > 0) { if (maxtries > 0) {
rnd_layers.push(l); rnd_layers.push(l);
this.nominations[ i ] = l.layerid this.nominations[ i ] = l.layerid
@ -492,7 +504,7 @@ export default class MapVote extends DiscordBasePlugin {
this.factionStrings[ i ] = getTranslation(l.teams[ 0 ]) + "-" + getTranslation(l.teams[ 1 ]); this.factionStrings[ i ] = getTranslation(l.teams[ 0 ]) + "-" + getTranslation(l.teams[ 1 ]);
} }
} }
if (!bypassRaasFilter && this.options.gamemodeWhitelist.includes("RAAS") && rnd_layers.filter((l) => l.gamemode === 'RAAS').length < Math.floor(maxOptions / 2)) this.populateNominations(); // if (!bypassRaasFilter && this.options.gamemodeWhitelist.includes("RAAS") && rnd_layers.filter((l) => l.gamemode === 'RAAS').length < Math.floor(maxOptions / 2)) this.populateNominations();
if (this.nominations.length == 0) { if (this.nominations.length == 0) {
this.populateNominations(steamid, cmdLayers, bypassRaasFilter); this.populateNominations(steamid, cmdLayers, bypassRaasFilter);
return; return;
@ -568,7 +580,10 @@ export default class MapVote extends DiscordBasePlugin {
return; return;
} }
if (this.options.votingDuration > 0) setTimeout(this.endVoting, this.options.votingDuration * 60 * 1000) if (this.options.votingDuration > 0) setTimeout(() => {
this.endVoting();
this.broadcast(this.options.voteWinnerBroadcastMessage + this.formatFancyLayer(Layers.layers.find((l)=>l.layerid == this.updateNextMap())));
}, this.options.votingDuration * 60 * 1000)
// these need to be reset after reenabling voting // these need to be reset after reenabling voting
this.trackedVotes = {}; this.trackedVotes = {};
@ -623,6 +638,32 @@ export default class MapVote extends DiscordBasePlugin {
//const winners = this.currentWinners; //const winners = this.currentWinners;
//await this.msgBroadcast(`Current winner${winners.length > 1 ? "s" : ""}: ${winners.join(", ")}`); //await this.msgBroadcast(`Current winner${winners.length > 1 ? "s" : ""}: ${winners.join(", ")}`);
} }
formatFancyLayer(layer) {
const translations = {
'United States Army': "USA",
'United States Marine Corps': "USMC",
'Russian Ground Forces': "RUS",
'British Army': "GB",
'Canadian Army': "CAF",
'Australian Defence Force': "AUS",
'Irregular Militia Forces': "IRR",
'Middle Eastern Alliance': "MEA",
'Insurgent Forces': "INS",
}
const factionString = getTranslation(layer.teams[ 0 ]) + "-" + getTranslation(layer.teams[ 1 ]);
return layer.map.name + ' ' + layer.gamemode + ' ' + factionString
function getTranslation(t) {
if (translations[ t.faction ]) return translations[ t.faction ]
else {
const f = t.faction.split(' ');
let fTag = "";
f.forEach((e) => { fTag += e[ 0 ] });
return fTag.toUpperCase();
}
}
}
async directMsgNominations(steamID) { async directMsgNominations(steamID) {
let strMsg = ""; let strMsg = "";