Files
dayz-reforger/src/database/guild.ts
T

210 lines
6.8 KiB
TypeScript

import { Snowflake } from "discord.js";
import DayZR from "../DayZRBot";
import { NitradoCredentialStatus } from "../util/NitradoAPI";
import { ArmbandName } from "./armbands";
import { MissionName } from "./destinations";
export const enum IntegerBoolean
{
FALSE,
TRUE
};
export interface UAV
{
// TODO: fill this out
};
export interface Alarm
{
// TODO: fill this out
};
export interface NitradoConfig
{
ServerID: string;
UserID: string;
Auth: string;
Status: NitradoCredentialStatus;
Mission: MissionName,
};
export interface FactionArmband
{
faction: Snowflake; // faction role ID
armband: ArmbandName;
}
interface GuildConfigAttributes
{
serverID: Snowflake; // Guild ID
lastLog: string | null;
serverName: string;
autoRestart: IntegerBoolean;
showKillfeedCoords: IntegerBoolean;
showKillfeedWeapon: IntegerBoolean;
purchaseUAV: IntegerBoolean;
purchaseEMP: IntegerBoolean;
allowedChannels: Array<Snowflake>; // Array of channel IDs
customChannelStatus?: boolean; // optional - generated outside of DB
hasBotAdmin?: boolean; // optional - generated outside of DB
killfeedChannel: Snowflake; // Channel ID
connectionLogsChannel: Snowflake; // Channel ID
activePlayersChannel: Snowflake; // Channel ID
welcomeChannel: Snowflake; // Channel ID
factionArmbands: Record<Snowflake, FactionArmband>;
usedArmbands: Array<string>;
excludedRoles: Array<string>;
hasExcludedRoles?: boolean; // optional - generated outside of DB
botAdminRoles: Array<Snowflake>; // Array of role IDs
alarms: Array<Alarm>;
events: Array<any>;
uavs: Array<UAV>;
incomeRoles: Array<Snowflake>; // Array of role IDs
incomeLimiter: number;
startingBalance: number;
uavPrice: number;
empPrice: number;
linkedGamertagRole: Snowflake; // Role ID
memberRole: Snowflake; // Role ID
adminRole: Snowflake; // Role ID
combatLogTimer: number;
}
interface GuildConfigDB
{
server: GuildConfigAttributes;
Nitrado: NitradoConfig | null;
};
// TODO: have better names, i.e. combatLogTimer in seconds or minutes? inclomeLimiter?
// TODO: figure out interface of
// Also this is so stupid, in the DB all server attributes are under server,
// while in the code we almost always have the attributes directly in top
// level of object, i.e. guild.startingBalance instead of guild.server.startingBalance
export interface GuildConfig extends GuildConfigAttributes
{
Nitrado: NitradoConfig | null;
}
export async function GetGuild(client: DayZR, GuildId: Snowflake): Promise<GuildConfig>
{
let guild: GuildConfigDB | null = null;
if (client.databaseConnected)
{
guild = await client.dbo.collection("guilds").findOne(
{
"server.serverID": GuildId
}
).then((guild: GuildConfigDB) => guild);
}
// If guild not found, generate guild default
if (!guild)
{
guild = {
server: getDefaultSettings(GuildId),
Nitrado: null,
};
if (client.databaseConnected)
{
client.dbo.collection("guilds").insertOne(guild, (err: string) => {
if (err) client.error(`GetGuild Insert Error: ${err}`);
});
}
}
return {
serverID: GuildId,
Nitrado: guild.Nitrado,
lastLog: guild.server.lastLog,
serverName: guild.server.serverName,
autoRestart: guild.server.autoRestart,
showKillfeedCoords: guild.server.showKillfeedCoords,
showKillfeedWeapon: guild.server.showKillfeedWeapon,
purchaseUAV: guild.server.purchaseUAV,
purchaseEMP: guild.server.purchaseEMP,
allowedChannels: guild.server.allowedChannels,
customChannelStatus: guild.server.allowedChannels.length > 0,
hasBotAdmin: guild.server.botAdminRoles.length > 0,
killfeedChannel: guild.server.killfeedChannel,
connectionLogsChannel: guild.server.connectionLogsChannel,
activePlayersChannel: guild.server.activePlayersChannel,
welcomeChannel: guild.server.welcomeChannel,
factionArmbands: guild.server.factionArmbands,
usedArmbands: guild.server.usedArmbands,
excludedRoles: guild.server.excludedRoles,
hasExcludedRoles: guild.server.excludedRoles.length > 0,
botAdminRoles: guild.server.botAdminRoles,
alarms: guild.server.alarms,
events: guild.server.events,
uavs: guild.server.uavs,
incomeRoles: guild.server.incomeRoles,
incomeLimiter: guild.server.incomeLimiter,
startingBalance: guild.server.startingBalance,
uavPrice: guild.server.uavPrice,
empPrice: guild.server.empPrice,
linkedGamertagRole: guild.server.linkedGamertagRole,
memberRole: guild.server.memberRole,
adminRole: guild.server.adminRole,
combatLogTimer: guild.server.combatLogTimer,
};
}
export function getDefaultSettings(GuildId: Snowflake): GuildConfigAttributes {
return {
serverID: GuildId,
lastLog: null,
serverName: "our server!",
autoRestart: IntegerBoolean.FALSE,
showKillfeedCoords: IntegerBoolean.FALSE,
showKillfeedWeapon: IntegerBoolean.FALSE,
purchaseUAV: IntegerBoolean.TRUE, // Allow/Disallow purchase of UAVs
purchaseEMP: IntegerBoolean.TRUE, // Allow/Disallow purchase of EMPs
allowedChannels: [],
killfeedChannel: "",
connectionLogsChannel: "",
activePlayersChannel: "",
welcomeChannel: "",
factionArmbands: {},
usedArmbands: [],
excludedRoles: [],
botAdminRoles: [],
alarms: [],
events: [],
uavs: [],
incomeRoles: [],
incomeLimiter: 168, // # of hours in 7 days
startingBalance: 500,
uavPrice: 50000,
empPrice: 500000,
linkedGamertagRole: "",
memberRole: "",
adminRole: "",
combatLogTimer: 5, // minutes
};
};