Skip to content

Commit cf787d0

Browse files
committed
Add serverPolling
1 parent f22bbd7 commit cf787d0

15 files changed

+285
-37
lines changed

index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export const config = {
6161
debug: getBooleanEnv('RPP_DEBUG', false),
6262
language: isValidLanguage(getStringEnv('RPP_LANGUAGE', 'en')) ?
6363
getStringEnv('RPP_LANGUAGE', 'en') as Languages : Languages.ENGLISH,
64-
pollingIntervalMs: getNumberEnv('RPP_POLLING_INTERVAL_MS', 10_000),
64+
serverPollingHandlerIntervalMs: getNumberEnv('RPP_SERVER_POLLING_HANDLER_INTERVAL_MS', 10_000),
6565
showCallStackOnError: getBooleanEnv('RPP_SHOW_CALL_STACK_ON_ERROR', false),
6666
reconnectIntervalMs: getNumberEnv('RPP_RECONNECT_INTERVAL_MS', 15_000)
6767
},

src/discordEvents/ready.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ export async function execute(dm: DiscordManager) {
112112
const gInstance = gim.getGuildInstance(guild.id) as GuildInstance;
113113
for (const [serverId, content] of Object.entries(gInstance.serverInfoMap)) {
114114
if (content.active) {
115-
if (rpm.addInstance(guild.id, serverId, content.mainSteamId)) {
115+
if (rpm.addInstance(guild.id, serverId, content.mainRequesterSteamId)) {
116116
const rpInstance = rpm.getInstance(guild.id, serverId);
117117
if (rpInstance) {
118118
await rpInstance.startup();

src/discordUtils/discordButtons.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export function getHelpButtons(): discordjs.ActionRowBuilder<discordjs.ButtonBui
156156

157157
export function getServerButtons(guildId: types.GuildId, serverId: types.ServerId,
158158
connectionStatus: ConnectionStatus):
159-
discordjs.ActionRowBuilder<discordjs.ButtonBuilder>[] {
159+
discordjs.ActionRowBuilder<discordjs.ButtonBuilder> {
160160
const gInstance = gim.getGuildInstance(guildId) as GuildInstance;
161161
const serverInfo = gInstance.serverInfoMap[serverId] as ServerInfo;
162162
const language = gInstance.generalSettings.language;
@@ -205,11 +205,9 @@ export function getServerButtons(guildId: types.GuildId, serverId: types.ServerI
205205
type: discordjs.ComponentType.Button
206206
});
207207

208-
return [
209-
new discordjs.ActionRowBuilder<discordjs.ButtonBuilder>().addComponents(
210-
connectionButton, viewButton, editButton, websiteButton, deleteButton
211-
)
212-
];
208+
return new discordjs.ActionRowBuilder<discordjs.ButtonBuilder>().addComponents(
209+
connectionButton, viewButton, editButton, websiteButton, deleteButton
210+
);
213211
}
214212

215213
export function getSmartSwitchButtons(guildId: types.GuildId, serverId: types.ServerId, entityId: types.EntityId,

src/discordUtils/discordMessages.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ export async function sendServerMessage(dm: DiscordManager, guildId: types.Guild
158158

159159
const content = {
160160
embeds: [discordEmbeds.getServerEmbed(guildId, serverId)],
161-
components: discordButtons.getServerButtons(guildId, serverId, connectionStatus)
161+
components: [
162+
await discordSelectMenus.getMainRequesterSteamIdSelectMenu(dm, guildId, serverId),
163+
discordButtons.getServerButtons(guildId, serverId, connectionStatus)]
162164
};
163165

164166
const message = await dm.sendUpdateMessage(guildId, content, gInstance.guildChannelIds.servers, serverInfo.

src/discordUtils/discordSelectMenus.ts

+47-1
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
import * as discordjs from 'discord.js';
2222

23-
import { guildInstanceManager as gim, localeManager as lm } from '../../index';
23+
import { guildInstanceManager as gim, localeManager as lm, credentialsManager as cm } from '../../index';
2424
import {
2525
GuildInstance, ServerInfo, SmartSwitch, SmartSwitchAutoSetting, VoiceGenders
2626
} from '../managers/guildInstanceManager';
2727
import * as types from '../utils/types';
2828
import { Languages, LanguageDiscordEmoji } from '../managers/LocaleManager';
29+
import { Credentials } from '../managers/credentialsManager';
30+
import { DiscordManager } from '../managers/discordManager';
2931

3032
export const StringSelectMenuLimits = {
3133
CustomId: 100,
@@ -203,6 +205,50 @@ export function getSmartSwitchSelectMenu(guildId: types.GuildId, serverId: types
203205
);
204206
}
205207

208+
export async function getMainRequesterSteamIdSelectMenu(dm: DiscordManager, guildId: types.GuildId,
209+
serverId: types.ServerId): Promise<discordjs.ActionRowBuilder<discordjs.StringSelectMenuBuilder>> {
210+
const gInstance = gim.getGuildInstance(guildId) as GuildInstance;
211+
const language = gInstance.generalSettings.language;
212+
const server = gInstance.serverInfoMap[serverId] as ServerInfo;
213+
const identifier = JSON.stringify({ 'serverId': serverId });
214+
const serverPairingDataMap = gInstance.pairingDataMap[serverId];
215+
216+
const options: discordjs.SelectMenuComponentOptionData[] = [];
217+
for (const [steamId, pairingData] of Object.entries(serverPairingDataMap)) {
218+
const credentials = cm.getCredentials(steamId) as Credentials;
219+
const member = await dm.getMember(guildId, credentials.discordUserId);
220+
const userName = member ? member.user.username : lm.getIntl(language, 'unknown');
221+
options.push({
222+
label: steamId,
223+
description: lm.getIntl(language, 'mainRequesterSteamIdOptionDesc', { user: userName }),
224+
value: steamId,
225+
emoji: pairingData.valid ? '✅' : '❌'
226+
});
227+
}
228+
229+
const credentials = cm.getCredentials(server.mainRequesterSteamId);
230+
let name = server.mainRequesterSteamId;
231+
if (credentials) {
232+
const member = await dm.getMember(guildId, credentials.discordUserId);
233+
const userName = member ? ` (${member.user.username})` : '';
234+
name += userName;
235+
}
236+
237+
const mainRequesterValid = Object.hasOwn(serverPairingDataMap, server.mainRequesterSteamId) &&
238+
serverPairingDataMap[server.mainRequesterSteamId].valid;
239+
const placeholder = `${mainRequesterValid ? '✅' : '❌'} ${name}`;
240+
241+
return new discordjs.ActionRowBuilder<discordjs.StringSelectMenuBuilder>().addComponents(
242+
getStringSelectMenu({
243+
customId: `MainRequesterSteamId${identifier}`,
244+
disabled: Object.keys(serverPairingDataMap).length === 0 ? true : false,
245+
placeholder: placeholder,
246+
options: options,
247+
type: discordjs.ComponentType.StringSelect
248+
})
249+
);
250+
}
251+
206252

207253
/**
208254
* Settings based selectMenus

src/handlers/buttonHandler.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ async function serverConnectButtonHandler(dm: DiscordManager, interaction: disco
425425
server.active = true;
426426
gim.updateGuildInstance(guildId);
427427

428-
if (rpm.addInstance(guildId, serverId, server.mainSteamId)) {
428+
if (rpm.addInstance(guildId, serverId, server.mainRequesterSteamId)) {
429429
const rpInstance = rpm.getInstance(guildId, serverId);
430430
if (rpInstance) {
431431
await rpInstance.startup();

src/handlers/selectMenuHandler.ts

+30-2
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020

2121
import * as discordjs from 'discord.js';
2222

23-
import { guildInstanceManager as gim, localeManager as lm } from '../../index';
23+
import { guildInstanceManager as gim, localeManager as lm, rustPlusManager as rpm } from '../../index';
2424
import { DiscordManager } from "../managers/discordManager";
2525
import * as types from '../utils/types';
26-
import { GuildInstance, VoiceGenders } from '../managers/guildInstanceManager';
26+
import { GuildInstance, ServerInfo, VoiceGenders } from '../managers/guildInstanceManager';
2727
import { Languages } from '../managers/LocaleManager';
2828
import * as discordMessages from '../discordUtils/discordMessages';
29+
import { ConnectionStatus } from '../managers/rustPlusManager';
2930

3031
export async function selectMenuHandler(dm: DiscordManager, interaction: discordjs.AnySelectMenuInteraction):
3132
Promise<boolean> {
@@ -40,6 +41,10 @@ export async function selectMenuHandler(dm: DiscordManager, interaction: discord
4041
return await inGameChatCommandResponseDelaySelectMenuHandler(dm,
4142
interaction as discordjs.StringSelectMenuInteraction);
4243
}
44+
else if (interaction.customId.startsWith('MainRequesterSteamId')) {
45+
return await mainRequesterSteamIdSelectMenuHandler(dm,
46+
interaction as discordjs.StringSelectMenuInteraction);
47+
}
4348

4449
return false;
4550
}
@@ -132,5 +137,28 @@ async function inGameChatCommandResponseDelaySelectMenuHandler(dm: DiscordManage
132137

133138
await discordMessages.sendSettingInGameChatCommandResponseDelayMessage(dm, guildId, true, false, interaction);
134139

140+
return true;
141+
}
142+
143+
async function mainRequesterSteamIdSelectMenuHandler(dm: DiscordManager,
144+
interaction: discordjs.StringSelectMenuInteraction): Promise<boolean> {
145+
const identifier = JSON.parse(interaction.customId.replace('MainRequesterSteamId', ''));
146+
const serverId = identifier.serverId as types.ServerId;
147+
const guildId = interaction.guildId as types.GuildId;
148+
const gInstance = gim.getGuildInstance(guildId) as GuildInstance;
149+
const server = gInstance.serverInfoMap[serverId] as ServerInfo;
150+
const steamId = interaction.values[0] as types.SteamId;
151+
152+
server.mainRequesterSteamId = steamId;
153+
gim.updateGuildInstance(guildId);
154+
155+
let connectionStatus = ConnectionStatus.Disconnected;
156+
const rpInstance = rpm.getInstance(guildId, serverId);
157+
if (rpInstance) {
158+
connectionStatus = rpInstance.connectionStatus;
159+
}
160+
161+
await discordMessages.sendServerMessage(dm, guildId, serverId, connectionStatus, interaction);
162+
135163
return true;
136164
}

src/languages/en.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
"autoSettingOffLabel": "OFF",
2323
"buttonActiveServer": "ACTIVE SERVER",
2424
"buttonAfk": "AFK",
25-
"buttonView": "VIEW",
2625
"buttonCommandPrefix": "COMMAND PREFIX",
2726
"buttonConnect": "CONNECT",
2827
"buttonConnecting": "CONNECTING",
@@ -40,6 +39,7 @@
4039
"buttonReconnecting": "RECONNECTING",
4140
"buttonRecycle": "RECYCLE",
4241
"buttonTrademark": "TRADEMARK",
42+
"buttonView": "VIEW",
4343
"buttonVoice": "VOICE",
4444
"buttonWebsite": "WEBSITE",
4545
"commandPrefix": "Command Prefix",
@@ -123,6 +123,7 @@
123123
"lastTrigger": "Last Trigger",
124124
"linkCap": "LINK",
125125
"linkToThePlugin": "Link to the Plugin",
126+
"mainRequesterSteamIdOptionDesc": "Set main requester to {user}.",
126127
"male": "Male",
127128
"message": "Message",
128129
"newsCap": "NEWS",

src/managers/fcmListenerManager.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ export class FcmListenerManager {
224224
const androidId = credentials.gcm.androidId;
225225
const securityToken = credentials.gcm.securityToken;
226226
this.listeners[steamId] = new PushReceiverClient(androidId, securityToken, []);
227+
// TODO! Something is messed up here. I tested with two steam accounts with credentials on the same discord
228+
// guild. For some reason the two fcm instances wont work together properly. When I pair in-game with account
229+
// 1, the above steamId is the one for account 2, but the data below is correct and from account 1. For the
230+
// love of god I cant figure out how to solve it. When I print each fcm listener (this.listeners) I can see
231+
// that each listener have the correct androidId and securityToken for the given steamId. This needs to be
232+
// solved before v2 release.
227233
this.listeners[steamId].on('ON_DATA_RECEIVED', (data: unknown) => {
228234
const funcName = `[FcmListenerManager: ON_DATA_RECEIVED: ${steamId}]`;
229235
if (!isValidFcmNotificaton(data)) {
@@ -449,7 +455,7 @@ async function pairingServer(flm: FcmListenerManager, steamId: types.SteamId, bo
449455
port: body.port,
450456
messageId: (message) ? message.id : null,
451457
pairedDate: Math.floor(Date.now() / 1000),
452-
mainSteamId: serverInfo ? serverInfo.mainSteamId : body.playerId,
458+
mainRequesterSteamId: serverInfo ? serverInfo.mainRequesterSteamId : body.playerId,
453459
active: serverInfo ? serverInfo.active : false,
454460
connect: null,
455461
noteMap: serverInfo ? serverInfo.noteMap : {},
@@ -649,7 +655,7 @@ async function alarmAlarm(flm: FcmListenerManager, steamId: types.SteamId, title
649655
}
650656

651657
const rpInstance = rpm.getInstance(guildId, serverId);
652-
if (!rpInstance && !serverInfo.active && steamId === serverInfo.mainSteamId &&
658+
if (!rpInstance && !serverInfo.active && steamId === serverInfo.mainRequesterSteamId &&
653659
gInstance.generalSettings.fcmAlarmNotify) {
654660
await discordMessages.sendFcmAlarmTriggerMessage(flm.dm, guildId, serverId, title, message);
655661
}
@@ -679,7 +685,7 @@ async function alarmPlugin(flm: FcmListenerManager, steamId: types.SteamId, titl
679685
continue;
680686
}
681687

682-
if (gInstance.generalSettings.fcmAlarmPluginNotify && steamId === serverInfo.mainSteamId) {
688+
if (gInstance.generalSettings.fcmAlarmPluginNotify && steamId === serverInfo.mainRequesterSteamId) {
683689
if ((gInstance.generalSettings.fcmAlarmPluginNotifyActiveServer && serverInfo.active) ||
684690
!gInstance.generalSettings.fcmAlarmPluginNotifyActiveServer) {
685691
discordMessages.sendFcmAlarmPluginTriggerMessage(flm.dm, guildId, serverId, title, message);
@@ -734,7 +740,7 @@ async function teamLogin(flm: FcmListenerManager, steamId: types.SteamId, body:
734740
}
735741

736742
const rpInstance = rpm.getInstance(guildId, serverId);
737-
if (!rpInstance && !serverInfo.active && steamId === serverInfo.mainSteamId) {
743+
if (!rpInstance && !serverInfo.active && steamId === serverInfo.mainRequesterSteamId) {
738744
await discordMessages.sendFcmTeamLoginMessage(flm.dm, guildId, serverId, body);
739745
log.info(`${funcName} ${body.targetName} just connected to ${body.name}.`);
740746
}

src/managers/guildInstanceManager.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ export interface ServerInfo {
274274
/* Rest */
275275
messageId: types.MessageId | null;
276276
pairedDate: types.Timestamp;
277-
mainSteamId: types.SteamId;
277+
mainRequesterSteamId: types.SteamId;
278278
active: boolean;
279279
connect: string | null;
280280
noteMap: NoteMap;
@@ -1397,7 +1397,7 @@ export function isValidServerInfo(object: unknown): object is ServerInfo {
13971397
'port',
13981398
'messageId',
13991399
'pairedDate',
1400-
'mainSteamId',
1400+
'mainRequesterSteamId',
14011401
'active',
14021402
'connect',
14031403
'noteMap',
@@ -1418,7 +1418,7 @@ export function isValidServerInfo(object: unknown): object is ServerInfo {
14181418
errors.push(vu.validateType('port', obj.port, 'string'));
14191419
errors.push(vu.validateType('messageId', obj.messageId, 'string', null));
14201420
errors.push(vu.validateType('pairedDate', obj.pairedDate, 'number'));
1421-
errors.push(vu.validateType('mainSteamId', obj.mainSteamId, 'string'));
1421+
errors.push(vu.validateType('mainRequesterSteamId', obj.mainRequesterSteamId, 'string'));
14221422
errors.push(vu.validateType('active', obj.active, 'boolean'));
14231423
errors.push(vu.validateType('connect', obj.connect, 'string', null));
14241424
errors.push(vu.validateObjectOfTypes('noteMap', obj.noteMap, 'string'));

0 commit comments

Comments
 (0)