chat
This commit is contained in:
@@ -45,6 +45,7 @@ public class LightlessDbContext : DbContext
|
||||
public DbSet<UserProfileData> UserProfileData { get; set; }
|
||||
public DbSet<User> Users { get; set; }
|
||||
public DbSet<UserPermissionSet> Permissions { get; set; }
|
||||
public DbSet<ReportedChatMessage> ReportedChatMessages { get; set; }
|
||||
public DbSet<GroupPairPreferredPermission> GroupPairPreferredPermissions { get; set; }
|
||||
public DbSet<UserDefaultPreferredPermission> UserDefaultPreferredPermissions { get; set; }
|
||||
public DbSet<CharaData> CharaData { get; set; }
|
||||
@@ -153,5 +154,11 @@ public class LightlessDbContext : DbContext
|
||||
mb.Entity<CharaDataAllowance>().HasIndex(c => c.ParentId);
|
||||
mb.Entity<CharaDataAllowance>().HasOne(u => u.AllowedGroup).WithMany().HasForeignKey(u => u.AllowedGroupGID).OnDelete(DeleteBehavior.Cascade);
|
||||
mb.Entity<CharaDataAllowance>().HasOne(u => u.AllowedUser).WithMany().HasForeignKey(u => u.AllowedUserUID).OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
mb.Entity<ReportedChatMessage>().ToTable("reported_chat_messages");
|
||||
mb.Entity<ReportedChatMessage>().HasIndex(r => r.ReporterUserUid);
|
||||
mb.Entity<ReportedChatMessage>().HasIndex(r => r.ReportedUserUid);
|
||||
mb.Entity<ReportedChatMessage>().HasIndex(r => r.MessageId).IsUnique();
|
||||
mb.Entity<ReportedChatMessage>().HasIndex(r => r.DiscordMessageId);
|
||||
}
|
||||
}
|
||||
1318
LightlessSyncServer/LightlessSyncShared/Migrations/20251028215549_ChatReports.Designer.cs
generated
Normal file
1318
LightlessSyncServer/LightlessSyncShared/Migrations/20251028215549_ChatReports.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,90 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace LightlessSyncServer.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class ChatReports : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "reported_chat_messages",
|
||||
columns: table => new
|
||||
{
|
||||
report_id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
report_time_utc = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
reporter_user_uid = table.Column<string>(type: "text", nullable: false),
|
||||
reported_user_uid = table.Column<string>(type: "text", nullable: true),
|
||||
channel_type = table.Column<byte>(type: "smallint", nullable: false),
|
||||
world_id = table.Column<int>(type: "integer", nullable: false),
|
||||
zone_id = table.Column<int>(type: "integer", nullable: false),
|
||||
channel_key = table.Column<string>(type: "text", nullable: false),
|
||||
message_id = table.Column<string>(type: "text", nullable: false),
|
||||
message_sent_at_utc = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
message_content = table.Column<string>(type: "text", nullable: false),
|
||||
sender_token = table.Column<string>(type: "text", nullable: false),
|
||||
sender_hashed_cid = table.Column<string>(type: "text", nullable: true),
|
||||
sender_display_name = table.Column<string>(type: "text", nullable: true),
|
||||
sender_was_lightfinder = table.Column<bool>(type: "boolean", nullable: false),
|
||||
snapshot_json = table.Column<string>(type: "text", nullable: true),
|
||||
reason = table.Column<string>(type: "text", nullable: true),
|
||||
additional_context = table.Column<string>(type: "text", nullable: true),
|
||||
discord_message_id = table.Column<decimal>(type: "numeric(20,0)", nullable: true),
|
||||
discord_message_posted_at_utc = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||
resolved = table.Column<bool>(type: "boolean", nullable: false),
|
||||
resolved_at_utc = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||
resolution_notes = table.Column<string>(type: "text", nullable: true),
|
||||
resolved_by_user_uid = table.Column<string>(type: "text", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("pk_reported_chat_messages", x => x.report_id);
|
||||
});
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "chat_banned",
|
||||
table: "users",
|
||||
type: "boolean",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "ix_reported_chat_messages_discord_message_id",
|
||||
table: "reported_chat_messages",
|
||||
column: "discord_message_id");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "ix_reported_chat_messages_message_id",
|
||||
table: "reported_chat_messages",
|
||||
column: "message_id",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "ix_reported_chat_messages_reported_user_uid",
|
||||
table: "reported_chat_messages",
|
||||
column: "reported_user_uid");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "ix_reported_chat_messages_reporter_user_uid",
|
||||
table: "reported_chat_messages",
|
||||
column: "reporter_user_uid");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "reported_chat_messages");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "chat_banned",
|
||||
table: "users");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -683,6 +683,131 @@ namespace LightlessSyncServer.Migrations
|
||||
b.ToTable("lodestone_auth", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("LightlessSyncShared.Models.ReportedChatMessage", b =>
|
||||
{
|
||||
b.Property<int>("ReportId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer")
|
||||
.HasColumnName("report_id");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("ReportId"));
|
||||
|
||||
b.Property<string>("AdditionalContext")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("additional_context");
|
||||
|
||||
b.Property<string>("ChannelKey")
|
||||
.IsRequired()
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("channel_key");
|
||||
|
||||
b.Property<byte>("ChannelType")
|
||||
.HasColumnType("smallint")
|
||||
.HasColumnName("channel_type");
|
||||
|
||||
b.Property<decimal?>("DiscordMessageId")
|
||||
.HasColumnType("numeric(20,0)")
|
||||
.HasColumnName("discord_message_id");
|
||||
|
||||
b.Property<DateTime?>("DiscordMessagePostedAtUtc")
|
||||
.HasColumnType("timestamp with time zone")
|
||||
.HasColumnName("discord_message_posted_at_utc");
|
||||
|
||||
b.Property<string>("MessageContent")
|
||||
.IsRequired()
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("message_content");
|
||||
|
||||
b.Property<string>("MessageId")
|
||||
.IsRequired()
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("message_id");
|
||||
|
||||
b.Property<DateTime>("MessageSentAtUtc")
|
||||
.HasColumnType("timestamp with time zone")
|
||||
.HasColumnName("message_sent_at_utc");
|
||||
|
||||
b.Property<string>("Reason")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("reason");
|
||||
|
||||
b.Property<DateTime>("ReportTimeUtc")
|
||||
.HasColumnType("timestamp with time zone")
|
||||
.HasColumnName("report_time_utc");
|
||||
|
||||
b.Property<string>("ReportedUserUid")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("reported_user_uid");
|
||||
|
||||
b.Property<string>("ReporterUserUid")
|
||||
.IsRequired()
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("reporter_user_uid");
|
||||
|
||||
b.Property<string>("ResolutionNotes")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("resolution_notes");
|
||||
|
||||
b.Property<bool>("Resolved")
|
||||
.HasColumnType("boolean")
|
||||
.HasColumnName("resolved");
|
||||
|
||||
b.Property<DateTime?>("ResolvedAtUtc")
|
||||
.HasColumnType("timestamp with time zone")
|
||||
.HasColumnName("resolved_at_utc");
|
||||
|
||||
b.Property<string>("ResolvedByUserUid")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("resolved_by_user_uid");
|
||||
|
||||
b.Property<string>("SenderDisplayName")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("sender_display_name");
|
||||
|
||||
b.Property<string>("SenderHashedCid")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("sender_hashed_cid");
|
||||
|
||||
b.Property<string>("SenderToken")
|
||||
.IsRequired()
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("sender_token");
|
||||
|
||||
b.Property<bool>("SenderWasLightfinder")
|
||||
.HasColumnType("boolean")
|
||||
.HasColumnName("sender_was_lightfinder");
|
||||
|
||||
b.Property<string>("SnapshotJson")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("snapshot_json");
|
||||
|
||||
b.Property<int>("WorldId")
|
||||
.HasColumnType("integer")
|
||||
.HasColumnName("world_id");
|
||||
|
||||
b.Property<int>("ZoneId")
|
||||
.HasColumnType("integer")
|
||||
.HasColumnName("zone_id");
|
||||
|
||||
b.HasKey("ReportId")
|
||||
.HasName("pk_reported_chat_messages");
|
||||
|
||||
b.HasIndex("DiscordMessageId")
|
||||
.HasDatabaseName("ix_reported_chat_messages_discord_message_id");
|
||||
|
||||
b.HasIndex("MessageId")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("ix_reported_chat_messages_message_id");
|
||||
|
||||
b.HasIndex("ReportedUserUid")
|
||||
.HasDatabaseName("ix_reported_chat_messages_reported_user_uid");
|
||||
|
||||
b.HasIndex("ReporterUserUid")
|
||||
.HasDatabaseName("ix_reported_chat_messages_reporter_user_uid");
|
||||
|
||||
b.ToTable("reported_chat_messages", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("LightlessSyncShared.Models.User", b =>
|
||||
{
|
||||
b.Property<string>("UID")
|
||||
@@ -699,6 +824,10 @@ namespace LightlessSyncServer.Migrations
|
||||
.HasColumnType("boolean")
|
||||
.HasColumnName("has_vanity");
|
||||
|
||||
b.Property<bool>("ChatBanned")
|
||||
.HasColumnType("boolean")
|
||||
.HasColumnName("chat_banned");
|
||||
|
||||
b.Property<bool>("IsAdmin")
|
||||
.HasColumnType("boolean")
|
||||
.HasColumnName("is_admin");
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using LightlessSync.API.Dto.Chat;
|
||||
|
||||
namespace LightlessSyncShared.Models;
|
||||
|
||||
/// <summary>
|
||||
/// Stores metadata about chat reports submitted by users.
|
||||
/// </summary>
|
||||
public class ReportedChatMessage
|
||||
{
|
||||
[Key]
|
||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
public int ReportId { get; set; }
|
||||
|
||||
[Required]
|
||||
public DateTime ReportTimeUtc { get; set; }
|
||||
|
||||
[Required]
|
||||
public string ReporterUserUid { get; set; } = string.Empty;
|
||||
|
||||
public string? ReportedUserUid { get; set; }
|
||||
|
||||
[Required]
|
||||
public ChatChannelType ChannelType { get; set; }
|
||||
|
||||
public ushort WorldId { get; set; }
|
||||
|
||||
public ushort ZoneId { get; set; }
|
||||
|
||||
[Required]
|
||||
public string ChannelKey { get; set; } = string.Empty;
|
||||
|
||||
[Required]
|
||||
public string MessageId { get; set; } = string.Empty;
|
||||
|
||||
public DateTime MessageSentAtUtc { get; set; }
|
||||
|
||||
[Required]
|
||||
public string MessageContent { get; set; } = string.Empty;
|
||||
|
||||
[Required]
|
||||
public string SenderToken { get; set; } = string.Empty;
|
||||
|
||||
public string? SenderHashedCid { get; set; }
|
||||
|
||||
public string? SenderDisplayName { get; set; }
|
||||
|
||||
public bool SenderWasLightfinder { get; set; }
|
||||
|
||||
public string SnapshotJson { get; set; } = string.Empty;
|
||||
|
||||
public string? Reason { get; set; }
|
||||
|
||||
public string? AdditionalContext { get; set; }
|
||||
|
||||
public ulong? DiscordMessageId { get; set; }
|
||||
|
||||
public DateTime? DiscordMessagePostedAtUtc { get; set; }
|
||||
|
||||
public bool Resolved { get; set; }
|
||||
|
||||
public DateTime? ResolvedAtUtc { get; set; }
|
||||
|
||||
public string? ResolutionNotes { get; set; }
|
||||
|
||||
public string? ResolvedByUserUid { get; set; }
|
||||
}
|
||||
@@ -22,6 +22,8 @@ public class User
|
||||
[MaxLength(9)]
|
||||
public string? TextGlowColorHex { get; set; } = string.Empty;
|
||||
|
||||
public bool ChatBanned { get; set; } = false;
|
||||
|
||||
public DateTime LastLoggedIn { get; set; }
|
||||
[MaxLength(15)]
|
||||
public string Alias { get; set; }
|
||||
|
||||
@@ -7,6 +7,7 @@ public class ServicesConfiguration : LightlessConfigurationBase
|
||||
public string DiscordBotToken { get; set; } = string.Empty;
|
||||
public ulong? DiscordChannelForMessages { get; set; } = null;
|
||||
public ulong? DiscordChannelForCommands { get; set; } = null;
|
||||
public ulong? DiscordChannelForChatReports { get; set; } = null;
|
||||
public ulong? DiscordRoleAprilFools2024 { get; set; } = null;
|
||||
public ulong? DiscordChannelForBotLog { get; set; } = null!;
|
||||
public ulong? DiscordRoleRegistered { get; set; } = null!;
|
||||
@@ -22,6 +23,7 @@ public class ServicesConfiguration : LightlessConfigurationBase
|
||||
sb.AppendLine($"{nameof(MainServerAddress)} => {MainServerAddress}");
|
||||
sb.AppendLine($"{nameof(DiscordChannelForMessages)} => {DiscordChannelForMessages}");
|
||||
sb.AppendLine($"{nameof(DiscordChannelForCommands)} => {DiscordChannelForCommands}");
|
||||
sb.AppendLine($"{nameof(DiscordChannelForChatReports)} => {DiscordChannelForChatReports}");
|
||||
sb.AppendLine($"{nameof(DiscordRoleAprilFools2024)} => {DiscordRoleAprilFools2024}");
|
||||
sb.AppendLine($"{nameof(DiscordRoleRegistered)} => {DiscordRoleRegistered}");
|
||||
sb.AppendLine($"{nameof(KickNonRegisteredUsers)} => {KickNonRegisteredUsers}");
|
||||
|
||||
Reference in New Issue
Block a user