Skip to content

Commit ad579b4

Browse files
author
Taran Vohra
authored
Merge pull request #21 from taranvohra/dev
Dev
2 parents 050c588 + c490ae6 commit ad579b4

File tree

10 files changed

+166
-18
lines changed

10 files changed

+166
-18
lines changed

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,13 @@ When the picking finishes, it will randomly decide which team won mapvote.
232232

233233
Disabled coin flip feature for the specified gametype.
234234

235+
**teamemojis** 🐱‍👤<br/>
236+
`Usage -> .teameojis emoji gametype`
237+
238+
Sets the preferred teamemoji for the gametype. `emoji` can be one of `agonies`, `cores` or `logos`.
239+
240+
Note that if `gametype` is omitted then the default is change it for **ALL** gametypes.
241+
235242
### Queries
236243

237244
**addqueryserver, aqs** 🐱‍👤<br/>

src/actions/index.ts

+17
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,20 @@ export const createNewUserLog = (
281281
description,
282282
timestamp: new Date(),
283283
});
284+
285+
export const updateGuildGameTypeTeamEmojis = (
286+
guildId: string,
287+
gameType: string,
288+
teamEmojis: TeamEmojis
289+
) =>
290+
Guilds.findOneAndUpdate(
291+
{
292+
_id: guildId,
293+
'gameTypes.name': gameType,
294+
},
295+
{
296+
$set: {
297+
'gameTypes.$.teamEmojis': teamEmojis,
298+
},
299+
}
300+
).exec();

src/commands/pugs.ts

+8
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ const pugsCommandList: Command[] = [
218218
isPrivileged: true,
219219
needsRegisteredGuild: true,
220220
},
221+
{
222+
group,
223+
key: 'handleAdminUpdateTeamEmojis',
224+
aliases: ['teamemojis'],
225+
type: 'args',
226+
isPrivileged: true,
227+
needsRegisteredGuild: true,
228+
},
221229
];
222230

223231
export default pugsCommandList;

src/formatting.ts

+24-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import {
1212
CONSTANTS,
1313
emojis,
14-
teamEmojis,
14+
allTeamEmojis,
1515
teams,
1616
isDuelPug,
1717
sanitizeName,
@@ -234,9 +234,15 @@ const getTeamIndex = (index: number) => {
234234
}
235235
};
236236

237+
const getTeamEmojis = (emoji?: TeamEmojis) => {
238+
if (!emoji) return allTeamEmojis['agonies'];
239+
return allTeamEmojis[emoji];
240+
};
241+
237242
export const formatBroadcastCaptainsReady = (pug: Pug) => {
238243
const pugCaptains = pug.captains.reduce((acc, curr, index) => {
239244
const teamIndex = getTeamIndex(index);
245+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
240246
acc += `<@${curr}> is the captain for ${teamEmojis[teamIndex]} **${teams[teamIndex]}** ${teamEmojis[teamIndex]}\n`;
241247
return acc;
242248
}, ``);
@@ -258,8 +264,13 @@ export const formatBroadcastCaptainsReady = (pug: Pug) => {
258264
return `${pugCaptains}\n${turn}\n${nonCaptainPlayers}`;
259265
};
260266

261-
export const formatAddCaptainStatus = (username: string, team: number) => {
267+
export const formatAddCaptainStatus = (
268+
username: string,
269+
team: number,
270+
pug: Pug
271+
) => {
262272
const teamIndex = getTeamIndex(team);
273+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
263274
return `**${username}** became captain for ${teamEmojis[teamIndex]} **${teams[
264275
teamIndex
265276
].toUpperCase()}** ${teamEmojis[teamIndex]}`;
@@ -302,6 +313,7 @@ export const formatPickPlayerStatus = (
302313
(_, i) => i
303314
).reduce((acc, _, i) => {
304315
const teamIndex = getTeamIndex(i);
316+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
305317
acc[i] = `**${teams[teamIndex]}** ${teamEmojis[teamIndex]} `;
306318
return acc;
307319
}, {} as { [team: number]: string });
@@ -335,9 +347,13 @@ export const formatPickPlayerStatus = (
335347
}\n${activeTeams}`;
336348
};
337349

338-
export const formatCoinFlipMapvoteWinner = (winningTeamIndex: number) => {
350+
export const formatCoinFlipMapvoteWinner = (
351+
winningTeamIndex: number,
352+
pug: Pug
353+
) => {
339354
const head = `---- *mapvote coin flip* ----`;
340355
const teamIndex = getTeamIndex(winningTeamIndex);
356+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
341357
const body = `${teamEmojis[teamIndex]} **${teams[
342358
teamIndex
343359
].toUpperCase()}** ${teamEmojis[teamIndex]} won **mapvote**`;
@@ -370,6 +386,7 @@ export const formatPugsInPicking = (pugs: Array<Pug>) => {
370386
(_, i) => i
371387
).reduce((acc, _, i) => {
372388
const teamIndex = getTeamIndex(i);
389+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
373390
acc[i] = `**${teams[teamIndex]}** ${teamEmojis[teamIndex]}`;
374391
return acc;
375392
}, {} as { [team: number]: string });
@@ -485,6 +502,7 @@ export const formatLastPug = (
485502
: Array.from({ length: pug.noOfTeams }, (_, i) => i).reduce(
486503
(acc, _, i) => {
487504
const teamIndex = getTeamIndex(i);
505+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
488506
acc[i] = `**${teams[teamIndex]}** ${teamEmojis[teamIndex]} `;
489507
return acc;
490508
},
@@ -524,7 +542,7 @@ export const formatLastPug = (
524542

525543
const mapvoteWinnerTeam =
526544
typeof coinFlipWinner === 'number'
527-
? `${formatMapvoteWinner(coinFlipWinner)}\n`
545+
? `${formatMapvoteWinner(coinFlipWinner, pug)}\n`
528546
: ``;
529547

530548
if (guildName) {
@@ -537,9 +555,10 @@ export const formatLastPug = (
537555
}
538556
};
539557

540-
export const formatMapvoteWinner = (team: number) => {
558+
export const formatMapvoteWinner = (team: number, pug: Pug) => {
541559
const { top, bottom } = edges[team];
542560
const winningTeam = teams[getTeamIndex(team)].toUpperCase();
561+
const teamEmojis = getTeamEmojis(pug.teamEmojis);
543562
const winningTeamEmoji = teamEmojis[getTeamIndex(team)];
544563
const mapvoteWinnerTeam = `${winningTeamEmoji} **${winningTeam}** ${winningTeamEmoji}`;
545564
return `${top}\n| ${mapvoteWinnerTeam} |\n${bottom}`;

src/global.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,6 @@ declare global {
4242
user?: User;
4343
pug?: Pug;
4444
};
45+
46+
export type TeamEmojis = 'agonies' | 'cores' | 'logos';
4547
}

src/handlers/pugHandlers.ts

+54-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
calculateBlockExpiry,
1414
isDuelPug,
1515
getRandomPickIndex,
16+
teamEmojiTypes,
1617
} from '~/utils';
1718
import {
1819
addGuildGameType,
@@ -25,6 +26,7 @@ import {
2526
setGuildGameTypeCoinFlipTo,
2627
updateGuildUserDefaultJoins,
2728
createNewUserLog,
29+
updateGuildGameTypeTeamEmojis,
2830
} from '~/actions';
2931
import store, {
3032
addGameType,
@@ -36,6 +38,7 @@ import store, {
3638
removeBlockedUser,
3739
enableCoinFlip,
3840
disableCoinFlip,
41+
updateTeamEmojis,
3942
} from '~/store';
4043
import {
4144
formatPugFilledDM,
@@ -129,7 +132,9 @@ export const handleAddGameType: Handler = async (message, args) => {
129132
pickingOrder,
130133
isCoinFlipEnabled: false,
131134
isMix,
132-
};
135+
teamEmojis: 'logos',
136+
} as const;
137+
133138
await addGuildGameType(guildId, newGameType);
134139
log.info(`Added new gametype ${name} to guild ${guildId}`);
135140

@@ -658,7 +663,9 @@ export const handleAddCaptain: Handler = async (message) => {
658663
`Added captain ${author.username} for pug ${forPug.name} at ${guild.id}`
659664
);
660665

661-
message.channel.send(formatAddCaptainStatus(author.username, assignedTeam));
666+
message.channel.send(
667+
formatAddCaptainStatus(author.username, assignedTeam, forPug)
668+
);
662669

663670
if (forPug.areCaptainsDecided()) {
664671
pugPubSub.emit('captains_ready', guild.id, forPug.name);
@@ -741,7 +748,7 @@ export const handlePickPlayer: Handler = async (
741748
const { isCoinFlipEnabled } = gameType;
742749
const coinflip = getRandomInt(0, forPug.noOfTeams - 1);
743750
if (isCoinFlipEnabled) {
744-
message.channel.send(formatCoinFlipMapvoteWinner(coinflip));
751+
message.channel.send(formatCoinFlipMapvoteWinner(coinflip, forPug));
745752
}
746753

747754
const sequences = await getNextSequences(guild.id, forPug.name);
@@ -1446,3 +1453,47 @@ export const handleAdminDisableMapvoteCoinFlip: Handler = async (
14461453
message.channel.send(`Mapvote coinflip disabled for **${gameType}**`);
14471454
log.info(`Exiting handleAdminDisableMapvoteCoinFlip`);
14481455
};
1456+
1457+
export const handleAdminUpdateTeamEmojis: Handler = async (message, args) => {
1458+
log.info(`Entering handleAdminUpdateTeamEmojis`);
1459+
const { guild } = message;
1460+
if (!guild) return;
1461+
1462+
const cache = store.getState();
1463+
const { gameTypes } = cache.pugs[guild.id];
1464+
1465+
const emoji = args[0].toLowerCase();
1466+
if (!(emoji in teamEmojiTypes)) {
1467+
message.channel.send(
1468+
`Invalid emoji type! Choose one of agonies, cores or logos`
1469+
);
1470+
return;
1471+
}
1472+
1473+
const forAllGameTypes = args[1] === undefined;
1474+
const gameTypeNames = forAllGameTypes
1475+
? gameTypes.map((g) => g.name)
1476+
: [args[1].toLowerCase()];
1477+
1478+
const teamEmojis = emoji as TeamEmojis;
1479+
gameTypeNames.forEach(async (name) => {
1480+
await updateGuildGameTypeTeamEmojis(guild.id, name, teamEmojis);
1481+
store.dispatch(
1482+
updateTeamEmojis({
1483+
guildId: guild.id,
1484+
name,
1485+
teamEmojis,
1486+
})
1487+
);
1488+
log.info(
1489+
`Updated team emoji preference for gametype ${name} at guild ${guild.id}`
1490+
);
1491+
});
1492+
1493+
message.channel.send(
1494+
`Team Emojis have been changed to **${emoji}** for **${
1495+
forAllGameTypes ? 'all gametypes' : `${args[1].toUpperCase()}`
1496+
}**`
1497+
);
1498+
log.info(`Exiting handleAdminUpdateTeamEmojis`);
1499+
};

src/models/Pug.ts

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class Pug {
3434
timerFn: ReturnType<typeof setTimeout> | null;
3535
isCoinFlipEnabled: boolean;
3636
isMix: boolean;
37+
teamEmojis?: TeamEmojis;
3738

3839
constructor({
3940
name,
@@ -42,13 +43,15 @@ export class Pug {
4243
pickingOrder,
4344
isCoinFlipEnabled,
4445
isMix,
46+
teamEmojis,
4547
}: {
4648
name: string;
4749
noOfPlayers: number;
4850
noOfTeams: number;
4951
pickingOrder: Array<number>;
5052
isCoinFlipEnabled: boolean;
5153
isMix: boolean;
54+
teamEmojis?: TeamEmojis;
5255
}) {
5356
this.name = name;
5457
this.noOfPlayers = noOfPlayers;
@@ -61,6 +64,7 @@ export class Pug {
6164
this.captains = [];
6265
this.timerFn = null;
6366
this.isMix = isMix;
67+
this.teamEmojis = teamEmojis;
6468
}
6569

6670
addPlayer(user: PugUser) {

src/models/guilds.ts

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export class GameType {
1818

1919
@prop()
2020
isMix!: boolean;
21+
22+
@prop()
23+
teamEmojis?: TeamEmojis;
2124
}
2225

2326
export class QueryServer {

src/store/slices/pugs.ts

+13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ type AddPugPayload = WithGuildID & { pug: Pug };
99
type RemovePugPayload = WithGuildID & GameTypeName;
1010
type EnableCoinFlipPayload = WithGuildID & GameTypeName;
1111
type DisableCoinFlipPayload = WithGuildID & GameTypeName;
12+
type UpdateTeamEmojiPayload = WithGuildID &
13+
GameTypeName & { teamEmojis: TeamEmojis };
1214

1315
type GameTypeName = { name: string };
1416

@@ -18,6 +20,7 @@ type GameType = GameTypeName & {
1820
noOfTeams: number;
1921
isCoinFlipEnabled: boolean;
2022
isMix: boolean;
23+
teamEmojis?: TeamEmojis;
2124
};
2225

2326
type GuildPugsState = {
@@ -81,6 +84,15 @@ const pugsSlice = createSlice({
8184
if (pugIndex !== -1)
8285
state[guildId].list[pugIndex].isCoinFlipEnabled = false;
8386
},
87+
updateTeamEmojis(state, action: PayloadAction<UpdateTeamEmojiPayload>) {
88+
const { guildId, name, teamEmojis } = action.payload;
89+
const { gameTypes, list } = state[guildId];
90+
const gameTypeIndex = gameTypes.findIndex((gt) => gt.name === name);
91+
const pugIndex = list.findIndex((pug) => pug.name === name);
92+
state[guildId].gameTypes[gameTypeIndex].teamEmojis = teamEmojis;
93+
if (pugIndex !== -1)
94+
state[guildId].list[pugIndex].teamEmojis = teamEmojis;
95+
},
8496
},
8597
});
8698

@@ -93,5 +105,6 @@ export const {
93105
enableCoinFlip,
94106
disableCoinFlip,
95107
setPugChannel,
108+
updateTeamEmojis,
96109
} = pugsSlice.actions;
97110
export const pugsReducer = pugsSlice.reducer;

0 commit comments

Comments
 (0)