Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Content.Client/Administration/UI/Tabs/ServerTab.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
<controls:ConfirmButton Name="ServerShutdownButton" Text="{Loc server-shutdown}" />
<cc:CommandButton Name="SetOocButton" Command="setooc" Text="{Loc server-ooc-toggle}" ToggleMode="True" />
<cc:CommandButton Name="SetLoocButton" Command="setlooc" Text="{Loc server-looc-toggle}" ToggleMode="True" />
<cc:CommandButton Name="SetAntagOocButton" Command="setantagooc" Text="{Loc server-antag-ooc-toggle}" ToggleMode="True" /> <!-- DeltaV: Antag OOC -->
</GridContainer>
</Control>
12 changes: 11 additions & 1 deletion Content.Client/Administration/UI/Tabs/ServerTab.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
锘縰sing Content.Shared.CCVar;
锘縰sing Content.Shared._DV.CCVars; // DeltaV - Antagonist OOC
using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.Console;
using Robust.Client.UserInterface;
Expand All @@ -20,6 +21,7 @@ public ServerTab()

_config.OnValueChanged(CCVars.OocEnabled, OocEnabledChanged, true);
_config.OnValueChanged(CCVars.LoocEnabled, LoocEnabledChanged, true);
_config.OnValueChanged(DCCVars.AntagOOCEnabled, AntagOocEnabledChanged, true); // DeltaV - antagonist OOC

ServerShutdownButton.OnPressed += _ => _console.ExecuteCommand("shutdown");
}
Expand All @@ -34,6 +36,13 @@ private void LoocEnabledChanged(bool value)
SetLoocButton.Pressed = value;
}

// Begin DeltaV - Antagonist OOC
private void AntagOocEnabledChanged(bool value)
{
SetAntagOocButton.Pressed = value;
}
// End DeltaV - Antagonist OOC

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
Expand All @@ -42,6 +51,7 @@ protected override void Dispose(bool disposing)
{
_config.UnsubValueChanged(CCVars.OocEnabled, OocEnabledChanged);
_config.UnsubValueChanged(CCVars.LoocEnabled, LoocEnabledChanged);
_config.UnsubValueChanged(DCCVars.AntagOOCEnabled, AntagOocEnabledChanged); // DeltaV - Antagonist OOC
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions Content.Client/Chat/Managers/ChatManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public void SendMessage(string text, ChatSelectChannel channel)
_consoleHost.ExecuteCommand($"asay \"{CommandParsing.Escape(str)}\"");
break;

// Begin DeltaV - Antag OOC
case ChatSelectChannel.AntagOOC:
_consoleHost.ExecuteCommand($"antagsay \"{CommandParsing.Escape(str)}\"");
break;
// End DeltaV - Antag OOC

case ChatSelectChannel.Emotes:
_consoleHost.ExecuteCommand($"me \"{CommandParsing.Escape(str)}\"");
break;
Expand Down
32 changes: 30 additions & 2 deletions Content.Client/UserInterface/Systems/Chat/ChatUIController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
using Content.Shared.Decals;
using Content.Shared.Input;
using Content.Shared.Radio;
using Content.Shared.Roles; // DeltaV - Antag OOC
using Content.Shared.Roles.RoleCodeword;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
Expand Down Expand Up @@ -69,6 +70,7 @@ public sealed partial class ChatUIController : UIController
[UISystemDependency] private readonly TransformSystem? _transform = default;
[UISystemDependency] private readonly MindSystem? _mindSystem = default!;
[UISystemDependency] private readonly RoleCodewordSystem? _roleCodewordSystem = default!;
[UISystemDependency] private readonly SharedRoleSystem? _roleSystem = default!; // DeltaV - Antag OOC

private static readonly ProtoId<ColorPalettePrototype> ChatNamePalette = "ChatNames";
private string[] _chatNameColors = default!;
Expand All @@ -88,7 +90,8 @@ public sealed partial class ChatUIController : UIController
{SharedChatSystem.AdminPrefix, ChatSelectChannel.Admin},
{SharedChatSystem.RadioCommonPrefix, ChatSelectChannel.Radio},
{SharedChatSystem.DeadPrefix, ChatSelectChannel.Dead},
{SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic} //Nyano - Summary: adds the telepathic prefix =.
{SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic}, //Nyano - Summary: adds the telepathic prefix =.
{SharedChatSystem.AntagOOCPrefix, ChatSelectChannel.AntagOOC} // DeltaV - Antag OOC
};

public static readonly Dictionary<ChatSelectChannel, char> ChannelPrefixes = new()
Expand All @@ -102,7 +105,8 @@ public sealed partial class ChatUIController : UIController
{ChatSelectChannel.Admin, SharedChatSystem.AdminPrefix},
{ChatSelectChannel.Radio, SharedChatSystem.RadioCommonPrefix},
{ChatSelectChannel.Dead, SharedChatSystem.DeadPrefix},
{ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix } //Nyano - Summary: associates telepathic with =.
{ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix }, //Nyano - Summary: associates telepathic with =.
{ChatSelectChannel.AntagOOC, SharedChatSystem.AntagOOCPrefix} // DeltaV - Antag OOC
};

/// <summary>
Expand Down Expand Up @@ -190,6 +194,7 @@ public override void Initialize()
_net.RegisterNetMessage<MsgChatMessage>(OnChatMessage);
_net.RegisterNetMessage<MsgDeleteChatMessagesBy>(OnDeleteChatMessagesBy);
SubscribeNetworkEvent<DamageForceSayEvent>(OnDamageForceSay);
SubscribeNetworkEvent<MindRoleTypeChangedEvent>(OnMindRoleTypeChanged); // DeltaV - Antag OOC
_config.OnValueChanged(CCVars.ChatEnableColorName, (value) => { _chatNameColorsEnabled = value; });
_chatNameColorsEnabled = _config.GetCVar(CCVars.ChatEnableColorName);

Expand Down Expand Up @@ -560,6 +565,22 @@ private void UpdateChannelPermissions()
CanSendChannels |= ChatSelectChannel.Dead;
}

// Begin DeltaV - Antag OOC
// antags and admins can see antagsay
var localUserId = _player.LocalSession?.UserId;
var antagOOCEligible = _admin.IsActive()
|| (localUserId is { } userId
&& _mindSystem != null
&& _roleSystem != null
&& _roleSystem.MindHasAntagonistOOC(_mindSystem.GetMind(userId)));

if (antagOOCEligible)
{
FilterableChannels |= ChatChannel.AntagOOC;
CanSendChannels |= ChatSelectChannel.AntagOOC;
}
// End DeltaV - Antag OOC

// only admins can see / filter asay
if (_admin.HasFlag(AdminFlags.Adminchat))
{
Expand Down Expand Up @@ -790,6 +811,13 @@ public void SendMessage(ChatBox box, ChatSelectChannel channel)
_manager.SendMessage(text, prefixChannel == 0 ? channel : prefixChannel);
}

// Begin DeltaV - Antagonist OOC
private void OnMindRoleTypeChanged(MindRoleTypeChangedEvent ev, EntitySessionEventArgs _)
{
UpdateChannelPermissions();
}
// End DeltaV - Antagonist OOC

private void OnDamageForceSay(DamageForceSayEvent ev, EntitySessionEventArgs _)
{
var chatBox = UIManager.ActiveScreen?.GetWidget<ChatBox>() ?? UIManager.ActiveScreen?.GetWidget<ResizableChatBox>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public sealed partial class ChannelFilterPopup : Popup
ChatChannel.Admin,
ChatChannel.AdminAlert,
ChatChannel.AdminChat,
ChatChannel.AntagOOC, // DeltaV - Antagonist OOC
ChatChannel.Server
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public Color ChannelSelectColor(ChatSelectChannel channel)
ChatSelectChannel.OOC => Color.LightSkyBlue,
ChatSelectChannel.Dead => Color.MediumPurple,
ChatSelectChannel.Admin => Color.HotPink,
ChatSelectChannel.AntagOOC => Color.Crimson, // DeltaV - Antagonist OOC
ChatSelectChannel.Telepathic => Color.PaleVioletRed, //Nyano - Summary: determines the color for the chat.
_ => Color.DarkGray
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ public sealed class ChannelSelectorPopup : Popup
ChatSelectChannel.LOOC,
ChatSelectChannel.OOC,
ChatSelectChannel.Dead,
ChatSelectChannel.Admin
ChatSelectChannel.Admin,
ChatSelectChannel.AntagOOC // DeltaV - Antagonist OOC
// NOTE: Console is not in there and it can never be permanently selected.
// You can, however, still submit commands as console by prefixing with /.
};
Expand Down
57 changes: 56 additions & 1 deletion Content.Server/Chat/Managers/ChatManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
using Content.Server.Ghost;
using Content.Server.Players.RateLimiting;
using Content.Server.Preferences.Managers;
using Content.Shared._DV.CCVars; // DeltaV - antagonist OOC
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.Chat;
using Content.Shared.Database;
using Content.Shared.Mind;
using Content.Shared.Players; // DeltaV - OOC muting
using Content.Shared.Players.RateLimiting;
using Content.Shared.Roles; // DeltaV - antagonist OOC
using Robust.Shared.Configuration;
using Robust.Shared.Map;
using Robust.Shared.Network;
Expand Down Expand Up @@ -60,6 +62,7 @@ internal sealed partial class ChatManager : IChatManager

private bool _oocEnabled = true;
private bool _adminOocEnabled = true;
private bool _antagOocEnabled = true; // DeltaV - antagonist OOC

private readonly Dictionary<NetUserId, ChatUser> _players = new();

Expand All @@ -70,6 +73,7 @@ public void Initialize()

_configurationManager.OnValueChanged(CCVars.OocEnabled, OnOocEnabledChanged, true);
_configurationManager.OnValueChanged(CCVars.AdminOocEnabled, OnAdminOocEnabledChanged, true);
_configurationManager.OnValueChanged(DCCVars.AntagOOCEnabled, OnAntagOocEnabledChanged, true); // DeltaV - antagonist OOC

_sawmill = _logManager.GetSawmill("SERVER");

Expand All @@ -92,6 +96,16 @@ private void OnAdminOocEnabledChanged(bool val)
DispatchServerAnnouncement(Loc.GetString(val ? "chat-manager-admin-ooc-chat-enabled-message" : "chat-manager-admin-ooc-chat-disabled-message"));
}

// Begin DeltaV - Antagonist OOC
private void OnAntagOocEnabledChanged(bool val)
{
if (_antagOocEnabled == val) return;

_antagOocEnabled = val;
DispatchServerAnnouncement(Loc.GetString(val ? "chat-manager-antag-ooc-chat-enabled-message" : "chat-manager-antag-ooc-chat-disabled-message"));
}
// End DeltaV - Antagonist OOC

public void DeleteMessagesBy(NetUserId uid)
{
if (!_players.TryGetValue(uid, out var user))
Expand Down Expand Up @@ -266,6 +280,11 @@ public void TrySendOOCMessage(ICommonSession player, string message, OOCChatType
case OOCChatType.Admin:
SendAdminChat(player, message);
break;
// Begin DeltaV - Antag OOC
case OOCChatType.AntagOOC:
SendAntagOOC(player, message);
break;
// End DeltaV - Antag OOC
}
}

Expand Down Expand Up @@ -341,6 +360,41 @@ private void SendAdminChat(ICommonSession player, string message)
_adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}");
}

// Begin DeltaV - Antagonist OOC
private void SendAntagOOC(ICommonSession player, string message)
{
var isAdmin = _adminManager.IsAdmin(player);
var roleSystem = _entityManager.System<SharedRoleSystem>();
var mindId = player.ContentData()?.Mind;

if (!isAdmin)
{
if (!_antagOocEnabled)
return;

if (!roleSystem.MindHasAntagonistOOC(mindId))
{
_adminLogger.Add(LogType.Chat, LogImpact.Extreme, $"{player:Player} attempted to send antag OOC message but was not admin or antagonist-OOC eligible");
return;
}
}

var wrappedMessage = Loc.GetString("chat-manager-send-antag-ooc-wrap-message",
("antagChannelName", Loc.GetString("chat-manager-antag-ooc-channel-name")),
("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));

var clients = _adminManager.ActiveAdmins.Select(p => p.Channel)
.Union(_player.Sessions
.Where(session => roleSystem.MindHasAntagonistOOC(session.ContentData()?.Mind))
.Select(session => session.Channel));

ChatMessageToMany(ChatChannel.AntagOOC, message, wrappedMessage, EntityUid.Invalid, false, true, clients.ToList(), author: player.UserId);

_discordLink.SendMessage(message, player.Name, ChatChannel.AntagOOC);
_adminLogger.Add(LogType.Chat, $"Antag OOC from {player:Player}: {message}");
}
// End DeltaV - Antagonist OOC

#endregion

#region Utility
Expand Down Expand Up @@ -491,5 +545,6 @@ private bool ShouldShowFollowButton(INetChannel recipient)
public enum OOCChatType : byte
{
OOC,
Admin
Admin,
AntagOOC // DeltaV - Antagonist OOC
}
18 changes: 18 additions & 0 deletions Content.Server/Discord/DiscordLink/DiscordChatLink.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
锘縰sing Content.Server.Chat.Managers;
using Content.Shared._DV.CCVars; // DeltaV - Antagonist OOC
using Content.Shared.CCVar;
using Content.Shared.Chat;
using NetCord;
Expand All @@ -20,6 +21,7 @@ public sealed class DiscordChatLink : IPostInjectInit

private ulong? _oocChannelId;
private ulong? _adminChannelId;
private ulong? _antagOocChannelId; // DeltaV - antagonist OOC

public void Initialize()
{
Expand All @@ -31,6 +33,7 @@ public void Initialize()

_configurationManager.OnValueChanged(CCVars.OocDiscordChannelId, OnOocChannelIdChanged, true);
_configurationManager.OnValueChanged(CCVars.AdminChatDiscordChannelId, OnAdminChannelIdChanged, true);
_configurationManager.OnValueChanged(DCCVars.AntagOOCDiscordChannelId, OnAntagOocChannelIdChanged, true); // DeltaV - antagonist OOC
}

public void Shutdown()
Expand All @@ -39,6 +42,7 @@ public void Shutdown()

_configurationManager.UnsubValueChanged(CCVars.OocDiscordChannelId, OnOocChannelIdChanged);
_configurationManager.UnsubValueChanged(CCVars.AdminChatDiscordChannelId, OnAdminChannelIdChanged);
_configurationManager.UnsubValueChanged(DCCVars.AntagOOCDiscordChannelId, OnAntagOocChannelIdChanged); // DeltaV - antagonist OOC
}

#if DEBUG
Expand Down Expand Up @@ -71,6 +75,19 @@ private void OnAdminChannelIdChanged(string channelId)
_adminChannelId = ulong.Parse(channelId);
}

// Begin DeltaV - Antagonist OOC
private void OnAntagOocChannelIdChanged(string channelId)
{
if (string.IsNullOrEmpty(channelId))
{
_antagOocChannelId = null;
return;
}

_antagOocChannelId = ulong.Parse(channelId);
}
// End DeltaV - Antagonist OOC

private void OnMessageReceived(Message message)
{
if (message.Author.IsBot)
Expand All @@ -94,6 +111,7 @@ public async void SendMessage(string message, string author, ChatChannel channel
{
ChatChannel.OOC => _oocChannelId,
ChatChannel.AdminChat => _adminChannelId,
ChatChannel.AntagOOC => _antagOocChannelId, // DeltaV - Antagonist OOC
_ => throw new InvalidOperationException("Channel not linked to Discord."),
};

Expand Down
31 changes: 31 additions & 0 deletions Content.Server/_DV/Chat/AntagSayCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Content.Server.Chat.Managers;
using Content.Shared.Administration;
using Robust.Shared.Console;

namespace Content.Server._DV.Chat;

[AnyCommand]
public sealed class AntagSayCommand : LocalizedCommands
{
[Dependency] private readonly IChatManager _chatManager = default!;

public override string Command => "antagsay";

public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (shell.Player is not { } player)
{
shell.WriteError(Loc.GetString($"shell-cannot-run-command-from-server"));
return;
}

if (args.Length < 1)
return;

var message = string.Join(" ", args).Trim();
if (string.IsNullOrEmpty(message))
return;

_chatManager.TrySendOOCMessage(player, message, OOCChatType.AntagOOC);
}
}
Loading
Loading