Merge branch 'staging' into session-mgr-cmp
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
@@ -24,6 +25,7 @@ using Torch.API.Managers;
|
||||
using Torch.API.Session;
|
||||
using Torch.Managers;
|
||||
using Torch.Server.Managers;
|
||||
using VRage.Game;
|
||||
|
||||
namespace Torch.Server
|
||||
{
|
||||
@@ -42,43 +44,75 @@ namespace Torch.Server
|
||||
public void BindServer(ITorchServer server)
|
||||
{
|
||||
_server = (TorchBase)server;
|
||||
ChatItems.Items.Clear();
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
ChatItems.Inlines.Clear();
|
||||
});
|
||||
|
||||
var sessionManager = server.Managers.GetManager<ITorchSessionManager>();
|
||||
sessionManager.SessionLoaded += BindSession;
|
||||
sessionManager.SessionUnloading += UnbindSession;
|
||||
if (sessionManager != null)
|
||||
sessionManager.SessionStateChanged += SessionStateChanged;
|
||||
}
|
||||
|
||||
private void BindSession(ITorchSession session)
|
||||
private void SessionStateChanged(ITorchSession session, TorchSessionState state)
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
switch (state)
|
||||
{
|
||||
var chatMgr = _server?.CurrentSession?.Managers.GetManager<IChatManagerClient>();
|
||||
if (chatMgr != null)
|
||||
DataContext = new ChatManagerProxy(chatMgr);
|
||||
});
|
||||
case TorchSessionState.Loading:
|
||||
Dispatcher.Invoke(() => ChatItems.Inlines.Clear());
|
||||
break;
|
||||
case TorchSessionState.Loaded:
|
||||
{
|
||||
var chatMgr = session.Managers.GetManager<IChatManagerClient>();
|
||||
if (chatMgr != null)
|
||||
chatMgr.MessageRecieved += OnMessageRecieved;
|
||||
}
|
||||
break;
|
||||
case TorchSessionState.Unloading:
|
||||
{
|
||||
var chatMgr = session.Managers.GetManager<IChatManagerClient>();
|
||||
if (chatMgr != null)
|
||||
chatMgr.MessageRecieved -= OnMessageRecieved;
|
||||
}
|
||||
break;
|
||||
case TorchSessionState.Unloaded:
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(state), state, null);
|
||||
}
|
||||
}
|
||||
|
||||
private void UnbindSession(ITorchSession session)
|
||||
private void OnMessageRecieved(TorchChatMessage msg, ref bool consumed)
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
(DataContext as ChatManagerProxy)?.Dispose();
|
||||
DataContext = null;
|
||||
});
|
||||
InsertMessage(msg);
|
||||
}
|
||||
|
||||
private void ChatHistory_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
private static readonly Dictionary<string, Brush> _brushes = new Dictionary<string, Brush>();
|
||||
private static Brush LookupBrush(string font)
|
||||
{
|
||||
ChatItems.ScrollToItem(ChatItems.Items.Count - 1);
|
||||
/*
|
||||
if (VisualTreeHelper.GetChildrenCount(ChatItems) > 0)
|
||||
if (_brushes.TryGetValue(font, out Brush result))
|
||||
return result;
|
||||
Brush brush = typeof(Brushes).GetField(font, BindingFlags.Static)?.GetValue(null) as Brush ?? Brushes.Blue;
|
||||
_brushes.Add(font, brush);
|
||||
return brush;
|
||||
}
|
||||
|
||||
private void InsertMessage(TorchChatMessage msg)
|
||||
{
|
||||
if (Dispatcher.CheckAccess())
|
||||
{
|
||||
|
||||
Border border = (Border)VisualTreeHelper.GetChild(ChatItems, 0);
|
||||
ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
|
||||
scrollViewer.ScrollToBottom();
|
||||
}*/
|
||||
bool atBottom = ChatScroller.VerticalOffset + 8 > ChatScroller.ScrollableHeight;
|
||||
var span = new Span();
|
||||
span.Inlines.Add($"{msg.Timestamp} ");
|
||||
span.Inlines.Add(new Run(msg.Author) { Foreground = LookupBrush(msg.Font) });
|
||||
span.Inlines.Add($": {msg.Message}");
|
||||
span.Inlines.Add(new LineBreak());
|
||||
ChatItems.Inlines.Add(span);
|
||||
if (atBottom)
|
||||
ChatScroller.ScrollToBottom();
|
||||
}
|
||||
else
|
||||
Dispatcher.Invoke(() => InsertMessage(msg));
|
||||
}
|
||||
|
||||
private void SendButton_Click(object sender, RoutedEventArgs e)
|
||||
@@ -102,11 +136,12 @@ namespace Torch.Server
|
||||
var commands = _server.CurrentSession?.Managers.GetManager<Torch.Commands.CommandManager>();
|
||||
if (commands != null && commands.IsCommand(text))
|
||||
{
|
||||
(DataContext as ChatManagerProxy)?.AddMessage(new TorchChatMessage() { Author = "Server", Message = text });
|
||||
InsertMessage(new TorchChatMessage("Server", text) { Font = MyFontEnum.DarkBlue });
|
||||
_server.Invoke(() =>
|
||||
{
|
||||
var response = commands.HandleCommandFromServer(text);
|
||||
Dispatcher.BeginInvoke(() => OnMessageEntered_Callback(response));
|
||||
string response = commands.HandleCommandFromServer(text);
|
||||
if (!string.IsNullOrWhiteSpace(response))
|
||||
InsertMessage(new TorchChatMessage("Server", response) { Font = MyFontEnum.Blue });
|
||||
});
|
||||
}
|
||||
else
|
||||
@@ -115,40 +150,5 @@ namespace Torch.Server
|
||||
}
|
||||
Message.Text = "";
|
||||
}
|
||||
|
||||
private void OnMessageEntered_Callback(string response)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(response))
|
||||
(DataContext as ChatManagerProxy)?.AddMessage(new TorchChatMessage() { Author = "Server", Message = response });
|
||||
}
|
||||
|
||||
private class ChatManagerProxy : IDisposable
|
||||
{
|
||||
private readonly IChatManagerClient _chatMgr;
|
||||
|
||||
public ChatManagerProxy(IChatManagerClient chatMgr)
|
||||
{
|
||||
this._chatMgr = chatMgr;
|
||||
this._chatMgr.MessageRecieved += ChatMgr_MessageRecieved; ;
|
||||
}
|
||||
|
||||
public IList<IChatMessage> ChatHistory { get; } = new ObservableList<IChatMessage>();
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Dispose()
|
||||
{
|
||||
_chatMgr.MessageRecieved -= ChatMgr_MessageRecieved;
|
||||
}
|
||||
|
||||
private void ChatMgr_MessageRecieved(TorchChatMessage msg, ref bool consumed)
|
||||
{
|
||||
AddMessage(msg);
|
||||
}
|
||||
|
||||
internal void AddMessage(TorchChatMessage msg)
|
||||
{
|
||||
ChatHistory.Add(new ChatMessage(DateTime.Now, msg.AuthorSteamId ?? 0, msg.Author, msg.Message));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user