mirror of
https://github.com/myawired/2025-RecRoom-Server-E12354.git
synced 2026-07-18 00:21:15 +10:00
2026 lines
71 KiB
C#
2026 lines
71 KiB
C#
using System;
|
|
using System.Numerics;
|
|
using System.Security.Principal;
|
|
using LiteDB;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Newtonsoft.Json;
|
|
using Rec_rewild_live_rewrite.api;
|
|
using Rec_rewild_live_rewrite.api.server;
|
|
using Rec_rewild_live_rewrite.api.server.Classes;
|
|
using Rec_rewild_live_rewrite.api.server.Classes.db_class;
|
|
using Rec_rewild_live_rewrite.Controllers;
|
|
using SixLabors.ImageSharp;
|
|
using static ImageMetadataDB;
|
|
|
|
namespace Rec_rewild_live_rewrite.api.dbs
|
|
{
|
|
public class PlayerDB
|
|
{
|
|
public static LiteDatabase PlayerDBFile = new LiteDatabase(Environment.CurrentDirectory + $"/Data/DBs/Players.db");
|
|
private static readonly Random random = new Random();
|
|
private static readonly object randLock = new object();
|
|
|
|
public static bool CreateAccount(Platforms platform, ulong platformId, string deviceId, ulong discord_id, out account_data account)
|
|
{
|
|
account = new account_data();
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var maxId = col.FindAll().OrderByDescending(x => x.id).FirstOrDefault()?.id ?? 0;
|
|
ulong accid = maxId + 1;
|
|
account.accountId = accid;
|
|
string name = Utils.GetRandomName();
|
|
|
|
account = new account_data
|
|
{
|
|
createdAt = DateTime.UtcNow,
|
|
identityFlags = 0,
|
|
isJunior = null,
|
|
personalPronouns = 0,
|
|
platforms = 0,
|
|
displayName = name,
|
|
username = name,
|
|
profileImage = Utils.GetRandomImageName(),
|
|
accountId = accid
|
|
};
|
|
col.Insert(new player_data
|
|
{
|
|
playerid = account.accountId,
|
|
id = accid,
|
|
platform = platform,
|
|
//platformId = platformId,
|
|
deviceId = new List<string>
|
|
{
|
|
deviceId
|
|
},
|
|
authtoken = Utils.GetRandomString(400),
|
|
password = "",
|
|
player = new player_info
|
|
{
|
|
Id = accid,
|
|
Username = account.username,
|
|
DisplayName = account.displayName,
|
|
XP = 0,
|
|
Level = 1,
|
|
created_at = account.createdAt,
|
|
bannerImage = null,
|
|
profileImage = account.profileImage,
|
|
IsJunior = false,
|
|
AvoidJuniors = true,
|
|
PlayerReputation = new mPlayerReputation
|
|
{
|
|
Noteriety = 0,
|
|
CheerCredit = 20,
|
|
CheerGeneral = 1,
|
|
CheerHelpful = 1,
|
|
CheerGreatHost = 1,
|
|
CheerSportsman = 1,
|
|
CheerCreative = 1,
|
|
SubscriberCount = 0,
|
|
SubscribedCount = 0,
|
|
SelectedCheer = CheerCategoryEnum.None
|
|
},
|
|
PlatformIds = new List<mPlatformID>
|
|
{
|
|
new mPlatformID
|
|
{
|
|
Platform = platform,
|
|
PlatformId = platformId
|
|
}
|
|
}
|
|
},
|
|
player_Extra = new player_extra
|
|
{
|
|
DormRoomID = 1,
|
|
IpAddresses = new List<string>(),
|
|
DiscordId = discord_id,
|
|
Bio = "",
|
|
avatar = "{\"FaceFeatures\": \"\",\"HairColor\": \"\",\"OutfitSelections\": \"\",\"SkinColor\": \"\"}",
|
|
SavedOutfits = new List<avatar_data_saved>(),
|
|
//ModerationBlockDetails = new Moderation_Detail.ModerationBlockDetails()
|
|
CheeredRooms = new List<ulong>(),
|
|
FavoritedRooms = new List<ulong>(),
|
|
sub_count = 0,
|
|
SubbedTo = new List<ulong>(),
|
|
IsRecentRoomHistoryVisible = true,
|
|
Influencer = new Influencer
|
|
{
|
|
creatorCode = "",
|
|
isInfluencer = false,
|
|
},
|
|
CustomAvatarItems = new Rec_rewild_live_rewrite.api.server.Classes.db_class.CustomAvatarItems(),
|
|
},
|
|
dev_Flag = DevFlag.none
|
|
});
|
|
//Settings.SaveSettings_db(Settings.CreateDefaultSettings(), accid);
|
|
HeartbeatDB.CreatePlayerHeartbeat(accid, out _, platform, DeviceClasses.Unknown);
|
|
CreateDormForPlayerId(accid);
|
|
return true;
|
|
}
|
|
|
|
public static bool ImportPlayers(string importPath)
|
|
{
|
|
Console.WriteLine($"[IMPORT] Starting player import");
|
|
Console.WriteLine($"[IMPORT] Import path: {importPath}");
|
|
|
|
try
|
|
{
|
|
if (!File.Exists(importPath))
|
|
{
|
|
Console.WriteLine($"[ERROR] Import file not found: {importPath}");
|
|
return false;
|
|
}
|
|
|
|
Console.WriteLine("[IMPORT] Reading import file...");
|
|
var json = File.ReadAllText(importPath);
|
|
Console.WriteLine($"[IMPORT] File size: {json.Length} bytes");
|
|
|
|
Console.WriteLine("[IMPORT] Deserializing player data...");
|
|
var importedPlayers = JsonConvert.DeserializeObject<List<player_data>>(json);
|
|
|
|
if (importedPlayers == null)
|
|
{
|
|
Console.WriteLine("[ERROR] Deserialization returned null (invalid JSON?)");
|
|
return false;
|
|
}
|
|
|
|
if (importedPlayers.Count == 0)
|
|
{
|
|
Console.WriteLine("[WARN] Import file contained 0 players");
|
|
return false;
|
|
}
|
|
|
|
Console.WriteLine($"[IMPORT] Players found in file: {importedPlayers.Count}");
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
int inserted = 0;
|
|
int skipped = 0;
|
|
|
|
foreach (var player in importedPlayers)
|
|
{
|
|
if (player == null)
|
|
{
|
|
Console.WriteLine("[WARN] Encountered null player entry, skipping");
|
|
skipped++;
|
|
continue;
|
|
}
|
|
|
|
Console.WriteLine($"[IMPORT] Processing player ID: {player.id}");
|
|
|
|
try
|
|
{
|
|
// Avoid duplicate IDs
|
|
if (col.Exists(x => x.id == player.id))
|
|
{
|
|
Console.WriteLine($"[SKIP] Duplicate player ID {player.id}");
|
|
skipped++;
|
|
continue;
|
|
}
|
|
player.player_Extra.DormRoomID = RoomDB.clone_dorm_room(player.playerid);
|
|
|
|
col.Insert(player);
|
|
var name = player.player.Username ?? "<unknown>";
|
|
var displayName = player.player.DisplayName ?? "<unknown>";
|
|
var displayEmoji = player.player.DisplayEmoji ?? "";
|
|
Console.WriteLine($"[OK] Inserted player ({player.id}) @{name} {displayName} {displayEmoji}");
|
|
inserted++;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[ERROR] Failed to insert player ID {player.id}: {ex.Message}");
|
|
skipped++;
|
|
}
|
|
}
|
|
|
|
Console.WriteLine("[IMPORT] Import completed");
|
|
Console.WriteLine($"[IMPORT] Inserted: {inserted}");
|
|
Console.WriteLine($"[IMPORT] Skipped: {skipped}");
|
|
Console.WriteLine($"[IMPORT] Total processed: {importedPlayers.Count}");
|
|
|
|
return inserted > 0;
|
|
}
|
|
catch (JsonException jex)
|
|
{
|
|
Console.WriteLine($"[ERROR] JSON parsing error: {jex.Message}");
|
|
return false;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[ERROR] Import failed with exception: {ex}");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool ExportPlayers(string exportPath)
|
|
{
|
|
try
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var allPlayers = col.FindAll().ToList();
|
|
|
|
var json = JsonConvert.SerializeObject(allPlayers, Formatting.Indented);
|
|
File.WriteAllText(exportPath, json);
|
|
|
|
Console.WriteLine($"Exported {allPlayers.Count} players to {exportPath}");
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"Export failed: {ex.Message}");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool CreateDormForPlayerId(ulong playerid, bool log = false)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
if (player.player_Extra != null)
|
|
{
|
|
ulong roomid = RoomDB.clone_dorm_room(playerid);
|
|
player.player_Extra.DormRoomID = roomid;
|
|
col.Update(player);
|
|
if (log)
|
|
{
|
|
Console.WriteLine($"Room id is {roomid} and successfully updaeted player");
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static void EnsureDormsForAllPlayers()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
// Get all players
|
|
var players = col.FindAll();
|
|
|
|
foreach (var player in players)
|
|
{
|
|
if (player?.player == null || player.player_Extra == null)
|
|
continue;
|
|
|
|
// Missing or invalid dorm
|
|
if (player.player_Extra.DormRoomID == null || player.player_Extra.DormRoomID == 1)
|
|
{
|
|
ulong roomId = RoomDB.clone_dorm_room(player.player.Id);
|
|
player.player_Extra.DormRoomID = roomId;
|
|
col.Update(player);
|
|
Console.WriteLine($"Created dorm {roomId} for player {player.player.Id}");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void EnsureDormsDontBeStupid(bool log = false)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var players = col.FindAll();
|
|
int fixCount = 0;
|
|
|
|
foreach (var player in players)
|
|
{
|
|
if (player?.player == null || player.player_Extra == null)
|
|
continue;
|
|
|
|
var room = RoomDB.GetRoom((ulong)player.player_Extra.DormRoomID);
|
|
|
|
// Check if the room is missing or simply isn't flagged as a Dorm
|
|
if (room == null || !room.IsDorm)
|
|
{
|
|
if (log)
|
|
{
|
|
string reason = (room == null) ? "Room Missing" : "Room not a Dorm";
|
|
Console.WriteLine($"[DormFix] Player: {player.player.Username} ({player.player.Id}) | Reason: {reason}");
|
|
}
|
|
|
|
CreateDormForPlayerId(player.player.Id);
|
|
fixCount++;
|
|
}
|
|
}
|
|
|
|
if (log && fixCount > 0)
|
|
{
|
|
Console.WriteLine($"[DormFix] Finished. Fixed {fixCount} player dorm records.");
|
|
}
|
|
}
|
|
|
|
|
|
public static ulong GetDormId(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
if (playerid == 1)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (player.player_Extra != null)
|
|
{
|
|
return (ulong)player.player_Extra.DormRoomID;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
public static bool GetLogins(Platforms platform, ulong platformId, out List<AccountLogin> accounts)
|
|
{
|
|
accounts = new List<AccountLogin>();
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
// Pull all players (or consider filtering by another simple field if possible)
|
|
var allPlayers = col.FindAll().ToList();
|
|
|
|
// Filter in memory
|
|
var players = allPlayers
|
|
.Where(player => player.player.PlatformIds != null &&
|
|
player.player.PlatformIds.Any(pid => pid.Platform == platform &&
|
|
pid.PlatformId == platformId))
|
|
.ToList();
|
|
|
|
if (players.Count == 0)
|
|
return false;
|
|
|
|
foreach (var player in players)
|
|
{
|
|
var pid = player.player.PlatformIds.First(p => p.Platform == platform &&
|
|
p.PlatformId == platformId);
|
|
|
|
accounts.Add(new AccountLogin
|
|
{
|
|
accountId = player.playerid,
|
|
createdAt = player.player.created_at,
|
|
lastLoginTime = player.player.last_login_time,
|
|
platform = (Platforms)pid.Platform,
|
|
platformId = pid.PlatformId.ToString()
|
|
});
|
|
}
|
|
|
|
accounts = accounts
|
|
.OrderByDescending(a => a.lastLoginTime)
|
|
.ToList();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
public static string GetAccountsBulk(List<ulong> playerIds)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
col.EnsureIndex(x => x.id);
|
|
|
|
var players = col.Find(x => playerIds.Contains(x.playerid)).ToList();
|
|
if (players.Count == 0)
|
|
{
|
|
return "[]";
|
|
}
|
|
|
|
var accounts = players
|
|
.Select(player =>
|
|
{
|
|
Platforms combinedPlatforms = Platforms.All;
|
|
|
|
if (player.player.PlatformIds != null && player.player.PlatformIds.Count > 0)
|
|
{
|
|
foreach (var entry in player.player.PlatformIds)
|
|
{
|
|
if (Enum.IsDefined(typeof(Platforms), entry.Platform))
|
|
{
|
|
combinedPlatforms |= (Platforms)entry.Platform;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combinedPlatforms = Enum.IsDefined(typeof(Platforms), player.platform)
|
|
? (Platforms)player.platform
|
|
: Platforms.All;
|
|
}
|
|
|
|
return new account_data_web
|
|
{
|
|
accountId = player.playerid,
|
|
createdAt = player.player.created_at,
|
|
displayName = player.player.DisplayName,
|
|
displayEmoji = player.player.DisplayEmoji,
|
|
username = player.player.Username,
|
|
identityFlags = player.player.identityFlags,
|
|
isJunior = player.player.IsJunior,
|
|
personalPronouns = player.player.pronounFlags,
|
|
platforms = (long)combinedPlatforms,
|
|
profileImage = player.player.profileImage,
|
|
bannerImage = player.player.bannerImage
|
|
};
|
|
})
|
|
.OrderBy(a => a.accountId)
|
|
.ToList();
|
|
|
|
return JsonConvert.SerializeObject(accounts);
|
|
}
|
|
|
|
public static string GetAccountsBulkAdmin(List<ulong> playerIds)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
col.EnsureIndex(x => x.id);
|
|
|
|
var players = col.Find(x => playerIds.Contains(x.playerid)).ToList();
|
|
if (players.Count == 0)
|
|
{
|
|
return "[]";
|
|
}
|
|
|
|
var accounts = players
|
|
.Select(player =>
|
|
{
|
|
Platforms combinedPlatforms = Platforms.All;
|
|
|
|
if (player.player.PlatformIds != null && player.player.PlatformIds.Count > 0)
|
|
{
|
|
foreach (var entry in player.player.PlatformIds)
|
|
{
|
|
if (Enum.IsDefined(typeof(Platforms), entry.Platform))
|
|
{
|
|
combinedPlatforms |= (Platforms)entry.Platform;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combinedPlatforms = Enum.IsDefined(typeof(Platforms), player.platform)
|
|
? (Platforms)player.platform
|
|
: Platforms.All;
|
|
}
|
|
|
|
return new
|
|
{
|
|
accountId = player.playerid,
|
|
createdAt = player.player.created_at,
|
|
displayName = player.player.DisplayName,
|
|
displayEmoji = player.player.DisplayEmoji,
|
|
username = player.player.Username,
|
|
identityFlags = player.player.identityFlags,
|
|
isJunior = player.player.IsJunior,
|
|
personalPronouns = player.player.pronounFlags,
|
|
platforms = (long)combinedPlatforms,
|
|
profileImage = player.player.profileImage,
|
|
bannerImage = player.player.bannerImage,
|
|
bio = player.player_Extra.Bio,
|
|
mbd = JsonConvert.DeserializeObject(PlayerDB.Get_moderation_block(player.playerid)),
|
|
PlatformIDs = player.player.PlatformIds.Select(p => new
|
|
{
|
|
p.Platform,
|
|
PlatformId = p.PlatformId.ToString(),
|
|
// Username = Steam.GetAccountInfoAsync(p.PlatformId.ToString()).Result?.PersonaName ?? ""
|
|
}),
|
|
level = player.player.Level,
|
|
xp = player.player.XP
|
|
};
|
|
})
|
|
.OrderBy(a => a.accountId)
|
|
.ToList();
|
|
|
|
return JsonConvert.SerializeObject(accounts);
|
|
}
|
|
|
|
|
|
public static player_data? getfullaccount_token(ulong playerid, ulong platformid, int platform)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
return null;
|
|
|
|
var ids = player.player.PlatformIds;
|
|
if (ids == null || ids.Count == 0)
|
|
return null;
|
|
|
|
bool match = ids.Any(p => p.PlatformId == platformid);
|
|
|
|
return match ? player : null;
|
|
}
|
|
|
|
/*public static player_data? GetFullAccount(ulong playerid, ulong plaformid, int plaform, string device_id)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
if (player.platformId == plaformid && player.deviceId.Contains(device_id))
|
|
return player;
|
|
return null;
|
|
}
|
|
*/
|
|
|
|
public static player_data? GetFullAccount(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return player;
|
|
}
|
|
|
|
public static player_data? GetFullAccountByName(string username)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Username == username);
|
|
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return player;
|
|
}
|
|
|
|
public static player_info? GetAccountById(ulong id)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindById(id);
|
|
return player?.player;
|
|
}
|
|
|
|
public static account_data_me? GetAccountMeSafe(ulong playerid)
|
|
{
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
Platforms combinedPlatforms = Platforms.All;
|
|
|
|
if (player.player.PlatformIds != null && player.player.PlatformIds.Count > 0)
|
|
{
|
|
foreach (var entry in player.player.PlatformIds)
|
|
{
|
|
// Only accept valid enum values
|
|
if (Enum.IsDefined(typeof(Platforms), entry.Platform))
|
|
{
|
|
combinedPlatforms |= (Platforms)entry.Platform;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Fallback to old single-platform field
|
|
combinedPlatforms = Enum.IsDefined(typeof(Platforms), player.platform)
|
|
? (Platforms)player.platform
|
|
: Platforms.All;
|
|
}
|
|
account_data_me account = new account_data_me
|
|
{
|
|
accountId = player.playerid,
|
|
bannerImage = player.player.bannerImage,
|
|
createdAt = player.player.created_at,
|
|
displayName = player.player.DisplayName,
|
|
email = player.player.Email,
|
|
displayEmoji = player.player.DisplayEmoji,
|
|
username = player.player.Username,
|
|
identityFlags = player.player.identityFlags,
|
|
isJunior = player.player.IsJunior,
|
|
personalPronouns = player.player.pronounFlags,
|
|
platforms = (long)combinedPlatforms,
|
|
profileImage = player.player.profileImage,
|
|
};
|
|
/*
|
|
account_data_me account = new account_data_me
|
|
{
|
|
accountId = player.playerid,
|
|
bannerImage = player.player.bannerImage,
|
|
createdAt = player.player.created_at,
|
|
displayName = player.player.DisplayName,
|
|
displayEmoji = player.player.DisplayEmoji,
|
|
username = player.player.Username,
|
|
identityFlags = player.player.identityFlags,
|
|
isJunior = player.player.IsJunior,
|
|
personalPronouns = player.player.pronounFlags,
|
|
platforms = (long)combinedPlatforms,
|
|
profileImage = player.player.profileImage,
|
|
};
|
|
*/
|
|
return account;
|
|
|
|
}
|
|
|
|
public static string Get_moderation_block(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return JsonConvert.SerializeObject(new Moderation_Detail.ModerationBlockDetails());
|
|
}
|
|
|
|
var block = player.player_Extra.ModerationBlockDetails;
|
|
|
|
if (block != null && block.Duration > 0 && block.ModerationSetUnixTime > 0)
|
|
{
|
|
// Permanent ban check
|
|
if (block.Duration == int.MaxValue)
|
|
return JsonConvert.SerializeObject(block);
|
|
|
|
long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
|
int elapsed = (int)(now - block.ModerationSetUnixTime);
|
|
int remaining = block.Duration - elapsed;
|
|
|
|
if (remaining <= 0)
|
|
{
|
|
player.player_Extra.ModerationBlockDetails = null;
|
|
col.Update(player);
|
|
return JsonConvert.SerializeObject(new Moderation_Detail.ModerationBlockDetails());
|
|
}
|
|
|
|
// Update duration to time left
|
|
block.Duration = remaining;
|
|
}
|
|
|
|
return JsonConvert.SerializeObject(block ?? new Moderation_Detail.ModerationBlockDetails());
|
|
}
|
|
|
|
|
|
|
|
public static string Set_moderation_block(
|
|
ulong playerid,
|
|
Moderation_Detail.ReportCategory category,
|
|
int duration,
|
|
long gameSessionId,
|
|
bool? isHostKick,
|
|
string? message,
|
|
ulong? playerIdReporter,
|
|
bool? isBan,
|
|
ulong bannedByPlayerId,
|
|
bool addAppealMessage = true
|
|
)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
return "{}";
|
|
if (addAppealMessage && isBan == true)
|
|
{
|
|
message += " To appeal this ban, DM @e12354 on Discord.";
|
|
}
|
|
var newBlock = new Moderation_Detail.ModerationBlockDetails
|
|
{
|
|
ReportCategory = category,
|
|
Duration = duration,
|
|
GameSessionId = gameSessionId,
|
|
IsHostKick = isHostKick,
|
|
Message = message,
|
|
PlayerIdReporter = playerIdReporter,
|
|
IsBan = isBan,
|
|
ModerationSetUnixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
|
|
BannedByPlayerId = bannedByPlayerId
|
|
};
|
|
|
|
player.player_Extra.ModerationBlockDetails = newBlock;
|
|
col.Update(player);
|
|
|
|
try
|
|
{
|
|
Notifications.SendToPlayer(playerid, JsonConvert.SerializeObject(WebsocketEvents.CreateBan(newBlock)));
|
|
}
|
|
catch { }
|
|
|
|
return JsonConvert.SerializeObject(newBlock);
|
|
}
|
|
|
|
|
|
public static bool HasActiveModerationBlock(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
return false;
|
|
|
|
var block = player.player_Extra.ModerationBlockDetails;
|
|
if (block == null || block.Duration <= 0 || block.ModerationSetUnixTime <= 0)
|
|
return false;
|
|
|
|
if (block.Duration == int.MaxValue) // Permanent ban
|
|
return true;
|
|
|
|
long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
|
int elapsed = (int)(now - block.ModerationSetUnixTime);
|
|
int remaining = block.Duration - elapsed;
|
|
|
|
if (remaining <= 0)
|
|
{
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static bool CheckDevFlag(ulong id)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.id == id);
|
|
|
|
if (player != null && (player.dev_Flag & DevFlag.dev) == DevFlag.dev)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool CheckModFlag(ulong id)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.id == id);
|
|
|
|
if (player != null && (player.dev_Flag & DevFlag.mod) == DevFlag.mod)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static void set_player_avatar(string avatar, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player_Extra.avatar = avatar;
|
|
col.Update(player_Setting1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static (bool Cheered, bool Favorited) GetInteraction(ulong playerid, ulong roomid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
return (false, false);
|
|
|
|
bool cheered = player.player_Extra.CheeredRooms?.Contains(roomid) ?? false;
|
|
bool favorited = player.player_Extra.FavoritedRooms?.Contains(roomid) ?? false;
|
|
|
|
return (cheered, favorited);
|
|
}
|
|
|
|
public static bool ToggleCheer(ulong playerid, ulong roomid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null) return false;
|
|
|
|
if (player.player_Extra.CheeredRooms == null)
|
|
player.player_Extra.CheeredRooms = new List<ulong>();
|
|
|
|
bool nowCheered;
|
|
if (player.player_Extra.CheeredRooms.Contains(roomid))
|
|
{
|
|
player.player_Extra.CheeredRooms.Remove(roomid);
|
|
nowCheered = false;
|
|
RoomDB.UpdateRoomCheerCount(roomid, -1);
|
|
}
|
|
else
|
|
{
|
|
player.player_Extra.CheeredRooms.Add(roomid);
|
|
nowCheered = true;
|
|
RoomDB.UpdateRoomCheerCount(roomid, +1);
|
|
}
|
|
|
|
col.Update(player);
|
|
return nowCheered;
|
|
}
|
|
|
|
public static bool ToggleFavorite(ulong playerid, ulong roomid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null) return false;
|
|
|
|
if (player.player_Extra.FavoritedRooms == null)
|
|
player.player_Extra.FavoritedRooms = new List<ulong>();
|
|
|
|
bool nowFavorited;
|
|
if (player.player_Extra.FavoritedRooms.Contains(roomid))
|
|
{
|
|
player.player_Extra.FavoritedRooms.Remove(roomid);
|
|
nowFavorited = false;
|
|
RoomDB.UpdateRoomFavoriteCount(roomid, -1);
|
|
}
|
|
else
|
|
{
|
|
player.player_Extra.FavoritedRooms.Add(roomid);
|
|
nowFavorited = true;
|
|
RoomDB.UpdateRoomFavoriteCount(roomid, +1);
|
|
}
|
|
|
|
col.Update(player);
|
|
return nowFavorited;
|
|
}
|
|
|
|
public static List<account_data> Search(string text)
|
|
{
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
List<account_data> list = new List<account_data>();
|
|
foreach (player_data room in col.FindAll())
|
|
{
|
|
bool found = true;
|
|
|
|
if (found)
|
|
{
|
|
if (text.StartsWith("@"))
|
|
{
|
|
if (!$"@{room.player.Username.ToLower()}".Contains(text.ToLower()))
|
|
{
|
|
found = false;
|
|
}
|
|
}
|
|
else if (room.player.DisplayName is not null)
|
|
{
|
|
if (!room.player.DisplayName.ToLower().Contains(text.ToLower()))
|
|
{
|
|
found = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (found)
|
|
{
|
|
var room_data = GetAccountBulk(room.playerid);
|
|
if (room_data is null)
|
|
continue;
|
|
list.Add(room_data);
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public static account_data GetAccountBulk(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
Platforms combinedPlatforms = Platforms.All;
|
|
|
|
if (player.player.PlatformIds != null && player.player.PlatformIds.Count > 0)
|
|
{
|
|
foreach (var entry in player.player.PlatformIds)
|
|
{
|
|
// Only accept valid enum values
|
|
if (Enum.IsDefined(typeof(Platforms), entry.Platform))
|
|
{
|
|
combinedPlatforms |= (Platforms)entry.Platform;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Fallback to old single-platform field
|
|
combinedPlatforms = Enum.IsDefined(typeof(Platforms), player.platform)
|
|
? (Platforms)player.platform
|
|
: Platforms.All;
|
|
}
|
|
|
|
return new account_data
|
|
{
|
|
accountId = player.playerid,
|
|
createdAt = player.player.created_at,
|
|
displayName = player.player.DisplayName,
|
|
username = player.player.Username,
|
|
identityFlags = 0,
|
|
isJunior = player.player.IsJunior,
|
|
personalPronouns = 0,
|
|
platforms = 1,
|
|
profileImage = player.player.profileImage,
|
|
};
|
|
}
|
|
|
|
public static bool SetPlayerUsername(string username, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var existingplayer = col.FindOne(x => x.player != null && x.player.Username == username && x.playerid != playerid);
|
|
if (existingplayer != null)
|
|
{
|
|
return false;
|
|
}
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.Username = username;
|
|
col.Update(player_Setting1);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool SetPlayerDev(DevFlag dev_Flag, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var playerRecord = col.FindOne(x => x.playerid == playerid);
|
|
if (playerRecord != null)
|
|
{
|
|
if (playerRecord.player != null)
|
|
{
|
|
playerRecord.dev_Flag = dev_Flag;
|
|
col.Update(playerRecord);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool SetAllDev()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
foreach (var playerRecord in col.FindAll())
|
|
{
|
|
if (playerRecord.player != null)
|
|
{
|
|
playerRecord.dev_Flag = DevFlag.dev;
|
|
col.Update(playerRecord);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static account_login<account_data> GetAccountPassword(string username, string password, bool isAdminPanel)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "Your username or password is empty, please enter a username and password.",
|
|
};
|
|
}
|
|
|
|
var player = col.FindOne(x => x.player.Username == username);
|
|
if (player == null)
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "The account you are trying to login to does not exist.",
|
|
};
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(player.password))
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "The password or username you entered don't match the account you are trying to login to."
|
|
};
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(password))
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "The password or username you entered don't match the account you are trying to login to.",
|
|
};
|
|
}
|
|
|
|
if (isAdminPanel)
|
|
{
|
|
var devCheckResult = PlayerDB.CheckDevFlag(player.playerid);
|
|
if (!devCheckResult)
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "You are not a developer",
|
|
};
|
|
}
|
|
}
|
|
|
|
bool isValid = ClientSecurity.VerifyPassword(password, player.password);
|
|
|
|
if (!isValid)
|
|
{
|
|
string oldHash = ClientSecurity.GetHashString(password);
|
|
if (string.Equals(player.password, oldHash, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
player.password = ClientSecurity.HashPassword(password);
|
|
col.Update(player);
|
|
}
|
|
else
|
|
{
|
|
return new account_login<account_data>
|
|
{
|
|
success = false,
|
|
error = "The password or username you entered don't match the account you are trying to login to."
|
|
};
|
|
}
|
|
}
|
|
|
|
return new account_login<account_data>
|
|
{
|
|
success = true,
|
|
error = "",
|
|
accid = player.playerid,
|
|
};
|
|
}
|
|
|
|
public static void SetPlayerPassword(string pass, ulong playerid, bool log)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var playerRecord = col.FindOne(x => x.playerid == playerid);
|
|
if (playerRecord != null && playerRecord.player != null)
|
|
{
|
|
playerRecord.password = ClientSecurity.HashPassword(pass);
|
|
col.Update(playerRecord);
|
|
if (log)
|
|
{
|
|
Console.WriteLine($"[Password Change] PlayerID: {playerid} has changed their password.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static bool SetPlayerBio(string bio, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player_Extra.Bio = bio;
|
|
col.Update(player_Setting1);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static async Task<bool> SetPlayerLevel(int level, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.Level = level;
|
|
try
|
|
{
|
|
await Notifications.SendToAll(JsonConvert.SerializeObject(WebsocketEvents.createResponse_levelupdate(playerid, level, 0)));
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
col.Update(player_Setting1);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static player_data? GetPlayerByDiscordId(ulong discordId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player_Extra.DiscordId == discordId);
|
|
return player;
|
|
}
|
|
|
|
public static void SetDisplayName(string username, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.DisplayName = username;
|
|
col.Update(player_Setting1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static bool SetLastLoginTime(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
if (player != null)
|
|
{
|
|
player.player.last_login_time = DateTime.UtcNow;
|
|
col.Update(player);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool ResetCheerCreditIfNewDay(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
if (player?.player?.PlayerReputation == null)
|
|
return false;
|
|
|
|
DateTime lastLoginDate = player.player.last_login_time.Date;
|
|
DateTime today = DateTime.UtcNow.Date;
|
|
|
|
if (lastLoginDate < today)
|
|
{
|
|
player.player.PlayerReputation.CheerCredit = 20;
|
|
player.player.last_login_time = DateTime.UtcNow;
|
|
|
|
col.Update(player);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
public static bool AddIpAddress(ulong playerid, string ip)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player_Extra.IpAddresses == null)
|
|
player.player_Extra.IpAddresses = new List<string>();
|
|
|
|
string encryptedIp = Utils.EncryptAes(ip);
|
|
|
|
if (!player.player_Extra.IpAddresses.Contains(encryptedIp))
|
|
player.player_Extra.IpAddresses.Add(encryptedIp);
|
|
|
|
col.Update(player);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
public static List<string> GetDecryptedIpAddresses(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
List<string> result = new();
|
|
if (player?.player_Extra?.IpAddresses != null)
|
|
{
|
|
foreach (string encryptedIp in player.player_Extra.IpAddresses)
|
|
{
|
|
try
|
|
{
|
|
result.Add(Utils.DecryptAes(encryptedIp));
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static void SetPlayerEmoji(string emoji, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.DisplayEmoji = emoji;
|
|
col.Update(player_Setting1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void SetPlayerPronounFlags(int pronounflag, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.pronounFlags = pronounflag;
|
|
col.Update(player_Setting1);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
public static void AddSubscription(ulong fromPlayerId, ulong toPlayerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var playerRecord = col.FindOne(x => x.playerid == fromPlayerId);
|
|
if (playerRecord == null || playerRecord.player_Extra == null)
|
|
throw new InvalidOperationException($"player_Extra for player {fromPlayerId} not found.");
|
|
|
|
// check if already subscribed
|
|
if (!playerRecord.player_Extra.SubbedTo.Contains(toPlayerId))
|
|
{
|
|
playerRecord.player_Extra.SubbedTo.Add(toPlayerId);
|
|
col.Update(playerRecord);
|
|
IncrementSubscriberCount(toPlayerId);
|
|
}
|
|
}
|
|
|
|
public static void IncrementSubscriberCount(ulong playerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
if (player != null && player.player_Extra != null)
|
|
{
|
|
player.player_Extra.sub_count++;
|
|
col.Update(player);
|
|
}
|
|
}
|
|
|
|
public static void RemoveSubscription(ulong fromPlayerId, ulong toPlayerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var playerRecord = col.FindOne(x => x.playerid == fromPlayerId);
|
|
if (playerRecord == null || playerRecord.player_Extra == null)
|
|
return;
|
|
|
|
if (playerRecord.player_Extra.SubbedTo.Remove(toPlayerId))
|
|
{
|
|
col.Update(playerRecord);
|
|
DecrementSubscriberCount(toPlayerId);
|
|
}
|
|
}
|
|
|
|
public static void DecrementSubscriberCount(ulong playerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
if (player != null && player.player_Extra != null && player.player_Extra.sub_count > 0)
|
|
{
|
|
player.player_Extra.sub_count--;
|
|
col.Update(player);
|
|
}
|
|
}
|
|
|
|
public static List<ulong> GetSubscribedToIds(ulong playerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var playerRecord = col.FindOne(x => x.playerid == playerId);
|
|
if (playerRecord != null && playerRecord.player_Extra != null)
|
|
{
|
|
return playerRecord.player_Extra.SubbedTo;
|
|
}
|
|
return new List<ulong>();
|
|
}
|
|
|
|
public static void SetPlayerIdentityFlags(int IdentityFlag, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.identityFlags = IdentityFlag;
|
|
col.Update(player_Setting1);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
|
|
public static void SetPlayerImageName(string imageName, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player?.player == null)
|
|
return;
|
|
|
|
player.player.profileImage = imageName;
|
|
col.Update(player);
|
|
}
|
|
|
|
public static void SetPlayerBanner(string imageName, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player?.player == null)
|
|
return;
|
|
|
|
player.player.bannerImage = imageName;
|
|
col.Update(player);
|
|
}
|
|
|
|
public static int GetAccountCountByPlatformId(ulong platformId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
return col.Count(x =>
|
|
x.player.PlatformIds != null &&
|
|
x.player.PlatformIds
|
|
.Select(pid => pid.PlatformId)
|
|
.Any(id => id == platformId)
|
|
);
|
|
}
|
|
public static int GetAccountCountByDiscordId(ulong discordId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
return col.Count(x =>
|
|
x.player_Extra != null &&
|
|
x.player_Extra.DiscordId == discordId
|
|
);
|
|
}
|
|
|
|
public static List<ulong> GetAccountIdsByDiscordId(ulong discordId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
return col
|
|
.Find(x =>
|
|
x.player_Extra != null &&
|
|
x.player_Extra.DiscordId == discordId
|
|
)
|
|
.Select(x => (ulong)x.playerid)
|
|
.ToList();
|
|
}
|
|
|
|
|
|
public static ulong GetPlayerCount()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var players = col.FindAll().ToList();
|
|
|
|
if (players.Count == 0)
|
|
return 0;
|
|
|
|
ulong minID = players.Min(p => p.playerid);
|
|
ulong maxID = players.Max(p => p.playerid);
|
|
ulong expectedCount = (ulong)(maxID - minID + 1);
|
|
|
|
return expectedCount;
|
|
}
|
|
|
|
|
|
|
|
public static List<object> Find_all_player_filtered(string? id, string? displayName, string? minLevel, string? jrState, string? platformId, string? deviceId, bool onlyBannedPlayers)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players"); List<object> list = new List<object>();
|
|
|
|
foreach (player_data player in col.FindAll())
|
|
{
|
|
if (id != null && player.playerid.ToString() != id)
|
|
continue;
|
|
|
|
if (displayName != null && !player.player.DisplayName.Contains(displayName, StringComparison.OrdinalIgnoreCase))
|
|
continue;
|
|
|
|
if (minLevel != null && int.TryParse(minLevel, out int minLvl))
|
|
{
|
|
if (player.player.Level < minLvl)
|
|
continue;
|
|
}
|
|
|
|
if (jrState != null && jrState != "N/A")
|
|
{
|
|
bool expectedJunior = jrState == "true";
|
|
if (player.player.IsJunior != expectedJunior)
|
|
continue;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(platformId) && (player.player.PlatformIds == null || !player.player.PlatformIds.Any(pid => pid.PlatformId.ToString() == platformId)))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (onlyBannedPlayers)
|
|
{
|
|
var block = player.player_Extra.ModerationBlockDetails;
|
|
if (block == null || block.IsBan != true || !HasActiveModerationBlock(player.playerid))
|
|
continue;
|
|
}
|
|
|
|
|
|
if (deviceId != null && !string.Equals(player.deviceId.ToString(), deviceId, StringComparison.OrdinalIgnoreCase))
|
|
continue;
|
|
|
|
var room_data = GetAccountBulk_full(player.playerid);
|
|
if (room_data != null)
|
|
list.Add(room_data);
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
public static object? GetAccountBulk_full(ulong playerid)
|
|
{
|
|
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
List<object> list = new List<object>();
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return null;
|
|
}
|
|
return new
|
|
{
|
|
AccountId = player?.playerid,
|
|
Level = player?.player?.Level,
|
|
xp = player?.player?.XP,
|
|
DisplayName = player?.player?.DisplayName,
|
|
DeviceId = player?.deviceId,
|
|
Username = player?.player?.Username,
|
|
IsJunior = player?.player?.IsJunior,
|
|
ProfileImage = player?.player?.profileImage,
|
|
LastLoginTime = player?.player?.last_login_time,
|
|
CreatedAt = player?.player?.created_at,
|
|
PlatformIDs = player?.player?.PlatformIds,
|
|
dormroom_id = player?.player_Extra?.DormRoomID,
|
|
};
|
|
}
|
|
|
|
public static void DeletePlayer(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player != null)
|
|
{
|
|
col.Delete(playerid);
|
|
Console.WriteLine("Deleted player id " + playerid);
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine($"Player with ID {playerid} not found.");
|
|
}
|
|
}
|
|
|
|
public static int DeletePlayersWithNullLastLogin()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var minDate = DateTime.MinValue;
|
|
|
|
var playersToDelete = col
|
|
.Find(x => x.player.last_login_time == minDate)
|
|
.Select(x => x.playerid)
|
|
.ToList();
|
|
|
|
int deleted = 0;
|
|
|
|
foreach (var id in playersToDelete)
|
|
{
|
|
if (DeletePlayerFull(id))
|
|
deleted++;
|
|
}
|
|
|
|
Console.WriteLine($"Deleted {deleted} players with default LastLogin.");
|
|
|
|
return deleted;
|
|
}
|
|
|
|
|
|
public static bool DeletePlayerFull(ulong playerid)
|
|
{
|
|
try
|
|
{
|
|
DeletePlayer(playerid);
|
|
RoomDB.DeleteAllRoomsFromPlayerId(playerid);
|
|
HeartbeatDB.ClearPlayerHeartbeat(playerid);
|
|
SettingsDB.DeleteSettings(playerid);
|
|
LinkDB.DeleteLinksFromPlayerId(playerid);
|
|
ImageMetadataDB.DeleteImagesFromPlayerId(playerid);
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static string SetRecentRooms(ulong playerid, ulong room_id)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
if (player != null)
|
|
{
|
|
if (player.player.recent_rooms == null)
|
|
{
|
|
player.player.recent_rooms = new List<ulong>();
|
|
}
|
|
|
|
player.player.recent_rooms.Remove(room_id);
|
|
player.player.recent_rooms.Insert(0, room_id);
|
|
|
|
col.Update(player);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
public static string GetRecentRooms(ulong playerId, int skip = 0, int take = 20)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerId);
|
|
|
|
if (player == null || player.player.recent_rooms == null || !player.player.recent_rooms.Any())
|
|
{
|
|
return "[]";
|
|
}
|
|
|
|
var paginatedRoomIds = player.player.recent_rooms
|
|
.Skip(Math.Max(0, skip))
|
|
.Take(Math.Max(1, take))
|
|
.ToList();
|
|
|
|
var visitedRooms = new List<RoomDBClasses.RoomRoot>();
|
|
|
|
foreach (ulong roomId in paginatedRoomIds)
|
|
{
|
|
var room = RoomDB.GetRoom(roomId);
|
|
if (room != null)
|
|
{
|
|
visitedRooms.Add(room);
|
|
}
|
|
}
|
|
|
|
return JsonConvert.SerializeObject(visitedRooms, Formatting.None);
|
|
}
|
|
|
|
|
|
public static string ClearRecentRoomsForAllPlayers()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var allPlayers = col.FindAll();
|
|
|
|
foreach (var player in allPlayers)
|
|
{
|
|
if (player.player.recent_rooms != null && player.player.recent_rooms.Count > 0)
|
|
{
|
|
player.player.recent_rooms = new List<ulong>();
|
|
col.Update(player);
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
public static string GetFavoritedRooms(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Id == playerid);
|
|
|
|
if (player == null || player.player_Extra.FavoritedRooms == null)
|
|
{
|
|
return "[]";
|
|
}
|
|
|
|
var favRooms = new List<RoomDBClasses.RoomRoot>();
|
|
|
|
foreach (ulong roomId in player.player_Extra.FavoritedRooms)
|
|
{
|
|
var room = RoomDB.GetRoom(roomId);
|
|
if (room != null)
|
|
{
|
|
favRooms.Add(room);
|
|
}
|
|
}
|
|
|
|
return JsonConvert.SerializeObject(favRooms);
|
|
}
|
|
|
|
// Todo: Make this support multiple device ids - e12354
|
|
public static void SetPlayerDeviceId(string DeviceId, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player != null)
|
|
{
|
|
player.deviceId = new List<string> { DeviceId };
|
|
col.Update(player);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
public static void SetPlayerDiscordId(ulong DiscordId, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player != null)
|
|
{
|
|
player.player_Extra.DiscordId = DiscordId;
|
|
col.Update(player);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string GetPlayerNameById(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
return player?.player.Username ?? "Unknown";
|
|
}
|
|
|
|
public static ulong GetPlayerIdByName(string name)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player.Username == name);
|
|
return player?.player.Id ?? 0;
|
|
}
|
|
|
|
public static string GetAvatarSaved(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
{
|
|
return "[]";
|
|
}
|
|
|
|
return JsonConvert.SerializeObject(player.player_Extra.SavedOutfits);
|
|
}
|
|
|
|
public static string SetAvatarSaved(ulong playerid, List<avatar_data_saved> avatars)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player == null)
|
|
return "[]";
|
|
|
|
if (player.player_Extra.SavedOutfits == null)
|
|
player.player_Extra.SavedOutfits = new List<avatar_data_saved>();
|
|
|
|
var incomingSlots = avatars.Select(a => a.Slot).ToHashSet();
|
|
player.player_Extra.SavedOutfits.RemoveAll(a => incomingSlots.Contains(a.Slot));
|
|
|
|
player.player_Extra.SavedOutfits.AddRange(avatars);
|
|
|
|
col.Update(player);
|
|
|
|
return JsonConvert.SerializeObject(player.player_Extra.SavedOutfits);
|
|
}
|
|
|
|
public static void SetPlayerCheer(CheerCategoryEnum cheer = CheerCategoryEnum.None, ulong playerid = 0)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player.PlayerReputation != null)
|
|
{
|
|
player_Setting1.player.PlayerReputation.SelectedCheer = cheer;
|
|
col.Update(player_Setting1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
public static CheerCategoryEnum? GetPlayerCheer(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player.PlayerReputation != null)
|
|
{
|
|
return player_Setting1.player.PlayerReputation.SelectedCheer;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static List<ulong> GetInfluencerIds()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var result = col.Query().Where(x => x.player_Extra.Influencer.isInfluencer == true).Select(x => x.playerid).ToList();
|
|
return result;
|
|
}
|
|
|
|
public static player_data? GetInfluencerByCreatorCode(string creatorcode)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.player_Extra.Influencer.creatorCode == creatorcode && x.player_Extra.Influencer.isInfluencer == true);
|
|
return player;
|
|
}
|
|
|
|
public static void SetIsInfluencer(ulong playerid, bool IsInfluencer)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player == null)
|
|
return;
|
|
|
|
if (player.player_Extra == null)
|
|
player.player_Extra = new player_extra();
|
|
|
|
if (player.player_Extra.Influencer == null)
|
|
player.player_Extra.Influencer = new Influencer();
|
|
|
|
player.player_Extra.Influencer.isInfluencer = IsInfluencer;
|
|
|
|
col.Update(player);
|
|
}
|
|
|
|
public static void SetCreatorCode(ulong playerid, string creatorcode)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player == null)
|
|
return;
|
|
|
|
if (player.player_Extra == null)
|
|
player.player_Extra = new player_extra();
|
|
|
|
if (player.player_Extra.Influencer == null)
|
|
player.player_Extra.Influencer = new Influencer();
|
|
|
|
player.player_Extra.Influencer.creatorCode = creatorcode;
|
|
|
|
col.Update(player);
|
|
}
|
|
|
|
public static void SupportInfluencer(ulong requestplayerid, ulong SupportId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == requestplayerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player_Extra.Influencer == null)
|
|
{
|
|
player.player_Extra.Influencer = new Influencer();
|
|
}
|
|
|
|
player.player_Extra.Influencer.SupportingInfluencer = SupportId;
|
|
col.Update(player);
|
|
return;
|
|
}
|
|
}
|
|
|
|
public static ulong? GetMyInfluencer(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
|
|
if (player != null)
|
|
{
|
|
if (player.player_Extra.Influencer != null)
|
|
{
|
|
return player.player_Extra.Influencer.SupportingInfluencer;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// message funcs
|
|
|
|
public static List<MessageData> GetMessages(ulong playerId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
|
|
if (player == null)
|
|
return new List<MessageData>();
|
|
|
|
if (player.player_Extra.Messages == null)
|
|
player.player_Extra.Messages = new List<MessageData>();
|
|
|
|
return player.player_Extra.Messages;
|
|
}
|
|
|
|
public static MessageData? AddMessage(ulong toPlayerId, ulong fromPlayerId, WebsocketEvents.MessageType type, string? data, ulong? roomId = null, ulong? playerEventId = null)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == toPlayerId);
|
|
|
|
if (player == null)
|
|
return null;
|
|
|
|
if (player.player_Extra.Messages == null)
|
|
player.player_Extra.Messages = new List<MessageData>();
|
|
|
|
var msg = new MessageData()
|
|
{
|
|
Id = GenerateRandomMessageId(),
|
|
FromPlayerId = fromPlayerId,
|
|
SentTime = DateTime.UtcNow,
|
|
Type = type,
|
|
Data = data,
|
|
RoomId = roomId,
|
|
PlayerEventId = playerEventId
|
|
};
|
|
|
|
player.player_Extra.Messages.Add(msg);
|
|
col.Update(player);
|
|
|
|
return msg;
|
|
}
|
|
|
|
public static void DeleteMessage(ulong playerId, ulong messageId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
|
|
if (player == null)
|
|
return;
|
|
|
|
if (player.player_Extra.Messages == null || player.player_Extra.Messages.Count == 0)
|
|
return;
|
|
|
|
var message = player.player_Extra.Messages.FirstOrDefault(m => m.Id == messageId);
|
|
|
|
if (message == null)
|
|
return;
|
|
|
|
player.player_Extra.Messages.Remove(message);
|
|
|
|
// Save changes
|
|
col.Update(player);
|
|
}
|
|
|
|
|
|
public static ulong GenerateRandomMessageId()
|
|
{
|
|
lock (randLock)
|
|
{
|
|
byte[] buffer = new byte[8];
|
|
random.NextBytes(buffer);
|
|
return BitConverter.ToUInt64(buffer, 0);
|
|
}
|
|
}
|
|
// message funcs
|
|
|
|
public static int SetCheerCredit(int cheerCredit, ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player_Setting1 = col.FindOne(x => x.playerid == playerid);
|
|
if (player_Setting1 != null)
|
|
{
|
|
if (player_Setting1.player != null)
|
|
{
|
|
player_Setting1.player.PlayerReputation.CheerCredit = cheerCredit;
|
|
col.Update(player_Setting1);
|
|
return cheerCredit;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public static void Setup()
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
col.EnsureIndex(x => x.playerid, true);
|
|
col.EnsureIndex(x => x.platform);
|
|
col.EnsureIndex(x => x.player.PlatformIds);
|
|
col.EnsureIndex(x => x.player.Username);
|
|
col.EnsureIndex(x => x.deviceId);
|
|
col.EnsureIndex(x => x.authtoken);
|
|
col.EnsureIndex(x => x.id);
|
|
col.EnsureIndex(x => x.player_Extra.Messages);
|
|
col.EnsureIndex("infl", "playerExtra.Influencer.isInfluencer");
|
|
}
|
|
|
|
public static string? GetPlayerData(ulong playerId, ulong roomId)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
|
|
if (player?.player_Extra?.MyRoomData?.PlayerData == null)
|
|
return null;
|
|
|
|
var entry = player.player_Extra.MyRoomData.PlayerData.FirstOrDefault(p => p.RoomId == roomId);
|
|
|
|
return entry?.Data;
|
|
}
|
|
|
|
public static bool SetPlayerData(ulong playerId, ulong roomId, string data)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerId);
|
|
|
|
if (player == null)
|
|
return false;
|
|
|
|
if (player.player_Extra == null)
|
|
player.player_Extra = new player_extra();
|
|
|
|
if (player.player_Extra.MyRoomData == null)
|
|
player.player_Extra.MyRoomData = new MyRoomData();
|
|
|
|
if (player.player_Extra.MyRoomData.PlayerData == null)
|
|
player.player_Extra.MyRoomData.PlayerData = new List<PlayerData>();
|
|
|
|
var existingEntry = player.player_Extra.MyRoomData.PlayerData.FirstOrDefault(p => p.RoomId == roomId);
|
|
|
|
if (existingEntry != null)
|
|
{
|
|
existingEntry.Data = data;
|
|
}
|
|
else
|
|
{
|
|
player.player_Extra.MyRoomData.PlayerData.Add(new PlayerData
|
|
{
|
|
RoomId = roomId,
|
|
Data = data
|
|
});
|
|
}
|
|
|
|
return col.Update(player);
|
|
}
|
|
|
|
public static PlayerPhotoTaggingSetting GetPlayerPhotoTaggingSetting(ulong playerid)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player != null)
|
|
{
|
|
return player.player_Extra.PlayerPhotoTaggingSetting;
|
|
}
|
|
}
|
|
return PlayerPhotoTaggingSetting.Anyone;
|
|
}
|
|
|
|
public static bool SetPlayerPhotoTaggingSetting(ulong playerid, PlayerPhotoTaggingSetting playerPhotoTaggingSetting)
|
|
{
|
|
var col = PlayerDBFile.GetCollection<player_data>("players");
|
|
var player = col.FindOne(x => x.playerid == playerid);
|
|
if (player != null)
|
|
{
|
|
if (player.player != null)
|
|
{
|
|
player.player_Extra.PlayerPhotoTaggingSetting = playerPhotoTaggingSetting;
|
|
col.Update(player);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|