Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chat Module Update #10

Merged
merged 1 commit into from
Dec 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions ConsoleLogReaderCSGO/Base/Interfaces/IMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleLogReaderCSGO.Base.Interfaces
{
public interface IMessage
{
#region Fields
public int ID { get; set; }
public string User { get; set; }
public string Text { get; set; }

#endregion
}
}
30 changes: 30 additions & 0 deletions ConsoleLogReaderCSGO/Base/MessageConsole.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using ConsoleLogReaderCSGO.Base.Roots;
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleLogReaderCSGO.Base
{
public class MessageConsole : Message
{
#region Fields
public bool IsDead { get; set; }
public ChatType MessageType { get; set; }
public string Location { get; set; }

#endregion

#region Constructors

public MessageConsole() { }
public MessageConsole(int id, string user, string text, bool isDead, ChatType type, string location = null) : base(id, user, text)
{
IsDead = isDead;
MessageType = type;
Location = location;
}

#endregion
}

}
27 changes: 27 additions & 0 deletions ConsoleLogReaderCSGO/Base/Roots/Message.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using ConsoleLogReaderCSGO.Base.Interfaces;
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleLogReaderCSGO.Base.Roots
{
public abstract class Message : IMessage
{
#region Fields
public int ID { get; set; }
public string User { get; set; }
public string Text { get; set; }

#endregion

#region Constructors
internal Message() { }
internal Message(int id, string user, string text)
{
ID = id;
User = user;
Text = text;
}
#endregion
}
}
1 change: 0 additions & 1 deletion ConsoleLogReaderCSGO/ConsoleLogReaderCSGO.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
</ItemGroup>

<ItemGroup>
<Folder Include="Operations\Chat\" />
<Folder Include="Operations\Damage\" />
</ItemGroup>

Expand Down
9 changes: 5 additions & 4 deletions ConsoleLogReaderCSGO/Data/LogRegex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ namespace ConsoleLogReaderCSGO.Data
{
internal static class LogRegex
{
public static Regex LogChat = new Regex(@"[ ][:][ ]");

public static Regex LogDamage = new Regex(@"^((Damage Given to)|(Damage Taken from)|(-------------------------)|(Player:(.*)- Damage Given)|(Player: (.*)- Damage Taken))");
public static Regex LogChat = new Regex($@"({Variables.MessageUserTextSeparator})");

public static Regex LogMatchInfo = new Regex(@"^((Steamworks Stats: CSteamWorksGameStatsClient Received CLIENT session id:)|(Steamworks Stats: CSteamWorksGameStatsClient Ending CLIENT session id:))");
public static Regex LogDamage = new Regex($@"^(({Variables.MessageDmg1})|({Variables.MessageDmg2})|({Variables.MessageDmg3})|({Variables.MessageDmg4})|({Variables.MessageDmg5}))");

public static (Regex, LogFlags)[] regexLog { get; private set; } =
public static Regex LogMatchInfo = new Regex($@"^(({Variables.MessageStartGame})|({Variables.MessageEndGame}))");
public static Regex LogChatTeam { get; private set; } = new Regex($@" ?({Variables.MessageDead}|)(({Variables.MessageCT}|{Variables.MessageTT})(.*))");
public static (Regex, LogFlags)[] RegexLog { get; private set; } =
{
(LogChat, LogFlags.Chat),
(LogDamage, LogFlags.Damage),
Expand Down
37 changes: 37 additions & 0 deletions ConsoleLogReaderCSGO/Data/Variables.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,45 @@ namespace ConsoleLogReaderCSGO.Data
{
internal static class Variables
{
#region logs

public static List<LogSorted> ConsoleLines { get; set; }

public static LogSorted[] ConsoleLinesArray { get; set; }

#endregion

#region chat

public static int LastIndexChat { get; set; }

#endregion

#region Console Log Lines

public const string MessageStartGame = "Steamworks Stats: CSteamWorksGameStatsClient Received CLIENT session id:";
public const string MessageEndGame = "Steamworks Stats: CSteamWorksGameStatsClient Ending CLIENT session id:";
public const string MessageDisconnectFromGame = "ChangeGameUIState: CSGO_GAME_UI_STATE_MAINMENU -> CSGO_GAME_UI_STATE_MAINMENU";
public const string MessageGameStartConfirm = "LoadingScreen::OnNetMsgSetConVar";
public const string MessageGameEndConfirmPNG = "PNG load error Interlace handling should be turned on when using png_read_image";

public const string MessageTT = "(Terrorist) ";
public const string MessageCT = "(Counter-Terrorist) ";
public const string MessageDead = "*DEAD*";
public const string MessageUserTextSeparator = " : ";
public const string MessageMapSpotSeparator = " @ ";

public const string MessageDamageTaken = "Damage Taken from";
public const string MessageDamageGiven = "Damage Given to ";

public const string MessageDmg1 = "Damage Given to";
public const string MessageDmg2 = "Damage Taken from";
public const string MessageDmg3 = "-------------------------";
public const string MessageDmg4 = "Player: (.*)- Damage Given";
public const string MessageDmg5 = "Player: (.*)- Damage Taken";



#endregion
}
}
30 changes: 30 additions & 0 deletions ConsoleLogReaderCSGO/Flags.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace ConsoleLogReaderCSGO
{

#region Enumerator Log Flag

/// <summary>
/// Enumerator of Log Flags
/// </summary>
Expand All @@ -30,4 +33,31 @@ public enum LogFlags
/// </summary>
All = 20,
}

#endregion

#region Enumerator Chat Type

/// <summary>
/// Enumerator for Type of console chat
/// </summary>
public enum ChatType
{
/// <summary>
/// Counter Terrorist chat, only readable for counter terrorist team
/// </summary>
CT = 1,
/// <summary>
/// Terrorist chat, only readable for terrorist team
/// </summary>
TT = 2,
/// <summary>
/// Global chat, readable for everyone
/// </summary>
GLOBAL = 3,
}

#endregion


}
29 changes: 29 additions & 0 deletions ConsoleLogReaderCSGO/LogReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,35 @@ public object[] GetLogs(LogFlags logFlag, params LogFlags[] logFlags)
UpdateLog(newLog, false);
}

/// <summary>
/// <br>Method returns a List that contains chats in provided logs. </br>
/// <br>Depend on provided parameter bool it return all chat logs or only chat logs that was not given from last time method executed.</br>
/// <para>returns List of MessageConsole</para>
/// </summary>
/// <param name="getAllChat">
/// <br>A boolean if <b>true</b> returns all chat message from log file.</br>
/// <br>A boolean if <b>false</b> returns only chat message from log file that was not given from last time method executed.</br>
/// </param>
/// <returns>
/// <para>Object List where every object cointains:</para>
/// <br>1) (int) <b>ID</b>- index of line in console logs</br>
/// <br>2) (string) <b>User</b> - username of message </br>
/// <br>3) (string) <b>Text</b> - a message </br>
/// <br>4) (bool) <b>IsDead</b> - if username when wrote message was dead </br>
/// <br>5) (ChatTypr) <b>MessageType</b> - enumerator that indicates if message is global, counter-terrorist team or terrorist team</br>
/// <br>6) (string) <b>Location</b> - if message was on team chat, showing map spot where message was wroten </br>
/// </returns>
public List<object> GetChat(bool getAllChat)
{
var result = getAllChat ? Operations.Chat.GetChat.GetChats(Data.Variables.ConsoleLines)
: Operations.Chat.GetChat.GetChats(Data.Variables.ConsoleLines, Data.Variables.LastIndexChat);
if (result != null)
{
return result.Cast<object>().ToList();
}
return new List<object> { };
}

/// <summary>
/// Method that remove all logs from instance.
/// </summary>
Expand Down
125 changes: 125 additions & 0 deletions ConsoleLogReaderCSGO/Operations/Chat/GetChat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
using ConsoleLogReaderCSGO.Base;
using ConsoleLogReaderCSGO.Data;
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleLogReaderCSGO.Operations.Chat
{
/// <summary>
/// Class that contains public and private methods of getting and sorting chat message
/// </summary>
internal class GetChat
{
#region Methods

/// <summary>
/// <br>Method to iterate all provided logs or from indicated index </br>
/// <br>Returns List of MessageConsole.</br>
/// </summary>
/// <param name="logs">Console logs</param>
/// <param name="startIndex">An index that indicated a line number where iteration starts </param>
public static List<MessageConsole> GetChats(List<LogSorted> logs, int startIndex = 0)
{
var chatMessages = new List<MessageConsole>();

for (int i = startIndex; i < logs.Count; i++)
{
if (logs[i].LogTypeFlag == LogFlags.Chat)
{
string line = logs[i].Line;
string user = GetUserFullName(line);

var messageCSGO = new MessageConsole()
{
ID = i,
Text = GetOnlyMessage(line),
IsDead = IsDead(line),
MessageType = GetChatType(user),
Location = GetLocation(ref user),
User = GetOnlyNickname(ref user),
};
chatMessages.Add(messageCSGO);
}
}
Variables.LastIndexChat = logs.Count;
return chatMessages;
}
#endregion

#region Methods private

/// <summary>
/// Returns true if user in chat line was dead when wrote a message.
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static bool IsDead(string line)
{
return line.StartsWith(Variables.MessageDead);
}

/// <summary>
/// Returns string that only contains username (and if is the case, string that contains game side with map spot too).
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static string GetUserFullName(string line)
{
return line.Substring(0, line.IndexOf(Variables.MessageUserTextSeparator)).Replace(Variables.MessageDead, string.Empty);
}

/// <summary>
/// Returns reference string that is substring for game side.
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static string GetOnlyNickname(ref string line)
{
return line.Replace(Variables.MessageTT, string.Empty).Replace(Variables.MessageCT, string.Empty);
}

/// <summary>
/// <br>Returns string that contains user message.</br>
/// <br>Message is finding after first occurrence of " : " chars</br>
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static string GetOnlyMessage(string line)
{
return line[(line.IndexOf(Variables.MessageUserTextSeparator) + 3)..];
}

/// <summary>
/// Returns Chat Type from provided line
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static ChatType GetChatType(string line)
{
return !Data.LogRegex.LogChatTeam.IsMatch(line) ? ChatType.GLOBAL
: line.Contains(Variables.MessageTT) ? ChatType.TT
: line.Contains(Variables.MessageCT) ? ChatType.CT
: ChatType.GLOBAL;
}

/// <summary>
/// <br>Returns string that contains user spot map</br>
/// <br>And return reference parameter that is truncated by spot map</br>
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private static string GetLocation(ref string line)
{
try
{
string result = line[line.IndexOf(Variables.MessageMapSpotSeparator)..];
line = line.Replace(result, string.Empty);
return result.Replace(Variables.MessageMapSpotSeparator, string.Empty);
}
catch(ArgumentOutOfRangeException) { return null; }
}

#endregion
}
}
2 changes: 1 addition & 1 deletion ConsoleLogReaderCSGO/Operations/Flag/SetFlagToLogLine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static LogFlags DetermineFlag(string line)
//Every Logflag has Regular Expression pattern and Exceptions list.

//Iterate patterns of RegularExpression looking for a match with 'line'.
foreach (var patternRegex in Data.LogRegex.regexLog)
foreach (var patternRegex in Data.LogRegex.RegexLog)
{
if (patternRegex.Item1.IsMatch(line))
{
Expand Down
2 changes: 1 addition & 1 deletion ConsoleLogReaderCSGO/Operations/ReadConsoleLogFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal static (LogSorted[], int) ReadConsoleFile(IEnumerable<string> logs)
return ((LogSorted[])logs.Select(x => new LogSorted(x, Flag.SetFlagToLogLine.DetermineFlag(x), counter++)).ToArray(), logs.ToArray().Length);
}
return (null, 0);

}
#endregion
}
Expand Down