Chat Filter using Flag Enums. (#270)

* Backing up local repo before upgrading OS, minor work on chat UI

* Cleaned out unnecessary modded files

* Got a working version of filter toggles based on flag enums

* Added localization to chatbox buttons

* Should actually fix modified proj files, thanks PJB

* Fixed enum operators to unset instead of toggle

* Added a local client class for storing net message details

* Reworked RepopulateChat to pull from a StoredChatMessage list

* Fixed messages dissapearing

* Re-ordered logic to be a bit more efficient with re-drawing chat
This commit is contained in:
tentekal
2019-07-18 17:32:48 -04:00
committed by Pieter-Jan Briers
parent ce1eab9181
commit 92668432a7
4 changed files with 273 additions and 3 deletions

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Net;
using Content.Client.Interfaces.Chat;
using Content.Shared.Chat;
using Robust.Client.Console;
@@ -7,6 +9,7 @@ using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using Robust.Client.UserInterface.Controls;
namespace Content.Client.Chat
{
@@ -16,6 +19,16 @@ namespace Content.Client.Chat
private const char OOCAlias = '[';
private const char MeAlias = '@';
public List<StoredChatMessage> filteredHistory = new List<StoredChatMessage>();
// Filter Button States
private bool _ALLstate;
private bool _Localstate;
private bool _OOCstate;
// Flag Enums for holding filtered channels
private ChatChannel _filteredChannels;
#pragma warning disable 649
[Dependency] private readonly IClientNetManager _netManager;
[Dependency] private readonly IClientConsole _console;
@@ -33,19 +46,27 @@ namespace Content.Client.Chat
if (_currentChatBox != null)
{
_currentChatBox.TextSubmitted -= _onChatBoxTextSubmitted;
_currentChatBox.FilterToggled -= _onFilterButtonToggled;
}
_currentChatBox = chatBox;
if (_currentChatBox != null)
{
_currentChatBox.TextSubmitted += _onChatBoxTextSubmitted;
_currentChatBox.FilterToggled += _onFilterButtonToggled;
}
}
private void _onChatMessage(MsgChatMessage message)
private void WriteChatMessage(StoredChatMessage message)
{
Logger.Debug($"{message.Channel}: {message.Message}");
if (IsFiltered(message.Channel))
{
Logger.Debug($"Message filtered: {message.Channel}: {message.Message}");
return;
}
var color = Color.DarkGray;
var messageText = message.Message;
if (!string.IsNullOrEmpty(message.MessageWrap))
@@ -64,6 +85,7 @@ namespace Content.Client.Chat
}
_currentChatBox?.AddLine(messageText, message.Channel, color);
}
private void _onChatBoxTextSubmitted(ChatBox chatBox, string text)
@@ -104,5 +126,90 @@ namespace Content.Client.Chat
}
}
}
private void _onFilterButtonToggled(ChatBox chatBox, Button.ButtonToggledEventArgs e)
{
// TODO make toggled ALL button flip all button states programatically + visually
switch (e.Button.Name)
{
case "Local":
_Localstate = !_Localstate;
if (_Localstate)
{
_filteredChannels |= ChatChannel.Local;
break;
}
else
{
_filteredChannels &= ~ChatChannel.Local;
break;
}
case "OOC":
_OOCstate = !_OOCstate;
if (_OOCstate)
{
_filteredChannels |= ChatChannel.OOC;
break;
}
else
{
_filteredChannels &= ~ChatChannel.OOC;
break;
}
default:
_ALLstate = !_ALLstate;
if (_ALLstate)
{
_filteredChannels = ChatChannel.OOC | ChatChannel.Local;
break;
}
else
{
_filteredChannels &= ~ChatChannel.OOC;
_filteredChannels &= ~ChatChannel.Local;
break;
}
}
RepopulateChat(filteredHistory);
}
private void RepopulateChat(List<StoredChatMessage> filteredMessages)
{
_currentChatBox.contents.Clear();
// Copy list for enumeration
List<StoredChatMessage> filteredMessagesCopy = new List<StoredChatMessage>(filteredMessages);
foreach (StoredChatMessage msg in filteredMessagesCopy)
{
WriteChatMessage(msg);
}
}
private void _onChatMessage(MsgChatMessage msg)
{
Logger.Debug($"{msg.Channel}: {msg.Message}");
// Log all incoming chat to repopulate when filter is un-toggled
StoredChatMessage storedMessage = new StoredChatMessage(msg);
filteredHistory.Add(storedMessage);
WriteChatMessage(storedMessage);
}
private bool IsFiltered(ChatChannel channel)
{
if (_filteredChannels.HasFlag(channel))
{
return true;
}
else
{
return false;
}
}
}
}