added chat history stuff

This commit is contained in:
RaidMax 2017-11-02 17:20:10 -05:00
parent 9699f7c3f1
commit 308427e662
10 changed files with 219 additions and 2 deletions

View File

@ -156,6 +156,9 @@
<Compile Include="WebService.cs" /> <Compile Include="WebService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="webfront\chat.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="webfront\images\minimap_mp_rust.png"> <Content Include="webfront\images\minimap_mp_rust.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>

Binary file not shown.

1
Admin/webfront/chat.html Normal file
View File

@ -0,0 +1 @@


View File

@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharedLibrary;
using System.IO;
using System.Data;
namespace StatsPlugin
{
public class ChatDatabase : Database
{
public ChatDatabase(string FN) : base(FN)
{
}
public override void Init()
{
if (!File.Exists(FileName))
{
string createChatHistory = @"CREATE TABLE `CHATHISTORY` (
`ClientID` INTEGER NOT NULL,
`Message` TEXT NOT NULL,
`ServerID` INTEGER NOT NULL,
`TimeSent` TEXT NOT NULL
);";
ExecuteNonQuery(createChatHistory);
string createChatStats = @"CREATE TABLE `WORDSTATS` (
`Word` TEXT NOT NULL,
`Count` INTEGER NOT NULL DEFAULT 1,
PRIMARY KEY(`Word`)
);";
ExecuteNonQuery(createChatStats);
}
}
private List<ChatHistory> GetChatHistoryFromQuery(DataTable dt)
{
return dt.Select().Select(q => new ChatHistory()
{
ClientID = Convert.ToInt32(q["ClientID"].ToString()),
Message = q["Message"].ToString(),
ServerID = Convert.ToInt32(q["ServerID"].ToString()),
TimeSent = DateTime.Parse(q["TimeSent"].ToString())
})
.ToList();
}
public List<ChatHistory> GetChatForPlayer(int clientID)
{
var queryResult = GetDataTable("CHATHISTORY", new KeyValuePair<string, object>("ClientID", clientID));
return GetChatHistoryFromQuery(queryResult);
}
public List<ChatHistory> GetChatForServer(int serverID)
{
var queryResult = GetDataTable("CHATHISTORY", new KeyValuePair<string, object>("ServerID", serverID));
return GetChatHistoryFromQuery(queryResult);
}
public void AddChatHistory(int clientID, int serverID, string message)
{
var chat = new Dictionary<string, object>()
{
{ "ClientID", clientID },
{ "ServerID", serverID },
{ "Message", message},
{ "TimeSent", DateTime.UtcNow }
};
Insert("CHATHISTORY", chat);
message.Split(' ').Where(word => word.Length >= 3).Any(word =>
{
word = word.ToLower();
Insert("WORDSTATS", new Dictionary<string, object>() { { "Word", word } }, true);
// shush :^)
ExecuteNonQuery($"UPDATE WORDSTATS SET Count = Count + 1 WHERE Word='{word.CleanChars()}'");
return true;
}
);
}
public KeyValuePair<string, int>[] GetWords()
{
var result = GetDataTable("SELECT * FROM WORDSTATS ORDER BY Count desc LIMIT 100");
return result.Select().Select(w => new KeyValuePair<string, int>(w["Word"].ToString(), Convert.ToInt32(w["Count"].ToString()))).ToArray();
}
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StatsPlugin
{
public class ChatHistory
{
public int ClientID { get; set; }
public string Message { get; set; }
public int ServerID { get; set; }
public DateTime TimeSent { get; set; }
}
}

View File

@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharedLibrary;
using System.Collections.Specialized;
namespace StatsPlugin.Chat
{
public class ChatPage : HTMLPage
{
public ChatPage() : base(false) { }
public override string GetContent(NameValueCollection querySet, IDictionary<string, string> headers)
{
StringBuilder S = new StringBuilder();
S.Append(LoadHeader());
IFile chat = new IFile("webfront\\chat.html");
S.Append(chat.GetText());
chat.Close();
S.Append(LoadFooter());
return S.ToString();
}
public override string GetName() => "Chat Stats";
public override string GetPath() => "/chat";
}
public class WordCloudJSON : IPage
{
public string GetName() => "Word Cloud JSON";
public string GetPath() => "/_words";
public string GetContentType() => "application/json";
public bool Visible() => false;
public HttpResponse GetPage(NameValueCollection querySet, IDictionary<string, string> headers)
{
HttpResponse resp = new HttpResponse()
{
contentType = GetContentType(),
content = Stats.ChatDB.GetWords().Select(w => new
{
Word = w.Key,
Count = w.Value
})
.OrderByDescending(x => x.Count)
.ToArray(),
additionalHeaders = new Dictionary<string, string>()
};
return resp;
}
}
public class ClientChatJSON : IPage
{
public string GetName() => "Client Chat JSON";
public string GetPath() => "/_clientchat";
public string GetContentType() => "application/json";
public bool Visible() => false;
public HttpResponse GetPage(NameValueCollection querySet, IDictionary<string, string> headers)
{
HttpResponse resp = new HttpResponse()
{
contentType = GetContentType(),
content = Stats.ChatDB.GetChatForPlayer(Convert.ToInt32(querySet["clientid"])).ToArray(),
additionalHeaders = new Dictionary<string, string>()
};
return resp;
}
}
}

View File

@ -99,6 +99,7 @@ namespace StatsPlugin
public static SharedLibrary.Interfaces.IManager ManagerInstance; public static SharedLibrary.Interfaces.IManager ManagerInstance;
public static int MAX_KILLEVENTS = 1000; public static int MAX_KILLEVENTS = 1000;
public static Dictionary<int, ServerStatInfo> ServerStats { get; private set; } public static Dictionary<int, ServerStatInfo> ServerStats { get; private set; }
public static ChatDatabase ChatDB { get; private set; }
public class ServerStatInfo public class ServerStatInfo
{ {
@ -197,10 +198,15 @@ namespace StatsPlugin
WebService.PageList.Add(new StatsPage()); WebService.PageList.Add(new StatsPage());
WebService.PageList.Add(new KillStatsJSON()); WebService.PageList.Add(new KillStatsJSON());
WebService.PageList.Add(new Chat.WordCloudJSON());
WebService.PageList.Add(new Chat.ClientChatJSON());
WebService.PageList.Add(new Chat.ChatPage());
ManagerInstance.GetMessageTokens().Add(new MessageToken("TOTALKILLS", GetTotalKills)); ManagerInstance.GetMessageTokens().Add(new MessageToken("TOTALKILLS", GetTotalKills));
ManagerInstance.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", GetTotalPlaytime)); ManagerInstance.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", GetTotalPlaytime));
ChatDB = new ChatDatabase("Database/ChatHistory.rm");
try try
{ {
var minimapConfig = MinimapConfig.Read("Config/minimaps.cfg"); var minimapConfig = MinimapConfig.Read("Config/minimaps.cfg");
@ -354,6 +360,11 @@ namespace StatsPlugin
await Victim.Tell(MessageOnStreak(curServer.killStreaks[Victim.ClientID], curServer.deathStreaks[Victim.ClientID])); await Victim.Tell(MessageOnStreak(curServer.killStreaks[Victim.ClientID], curServer.deathStreaks[Victim.ClientID]));
} }
if (E.Type == Event.GType.Say)
{
ChatDB.AddChatHistory(E.Origin.DatabaseID, E.Owner.GetPort(), E.Data);
}
} }
public static string GetTotalKills() public static string GetTotalKills()

View File

@ -69,6 +69,9 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Chat\ChatDatabase.cs" />
<Compile Include="Chat\ChatHistory.cs" />
<Compile Include="Chat\ChatHistoryPage.cs" />
<Compile Include="IW4Info.cs" /> <Compile Include="IW4Info.cs" />
<Compile Include="MinimapConfig.cs" /> <Compile Include="MinimapConfig.cs" />
<Compile Include="Plugin.cs" /> <Compile Include="Plugin.cs" />

View File

@ -65,13 +65,17 @@ namespace IW4MAdmin.Plugins
await S.RemovePlayer(index); await S.RemovePlayer(index);
await S.AddPlayer(p); await S.AddPlayer(p);
Interval = DateTime.Now; Interval = DateTime.Now;
if (S.ClientNum > 0) if (S.ClientNum > 0)
{ {
//"K;26d2f66b95184934;1;allies;egor;5c56fef676b3818d;0;axis;1_din;m21_heartbeat_mp;98;MOD_RIFLE_BULLET;torso_lower"; //"K;26d2f66b95184934;1;allies;egor;5c56fef676b3818d;0;axis;1_din;m21_heartbeat_mp;98;MOD_RIFLE_BULLET;torso_lower";
var victimPlayer = S.Players.Where(pl => pl != null).ToList()[rand.Next(0, S.ClientNum - 1)]; var victimPlayer = S.Players.Where(pl => pl != null).ToList()[rand.Next(0, S.ClientNum - 1)];
var attackerPlayer = S.Players.Where(pl => pl != null).ToList()[rand.Next(0, S.ClientNum - 1)]; var attackerPlayer = S.Players.Where(pl => pl != null).ToList()[rand.Next(0, S.ClientNum - 1)];
await S.ExecuteEvent(new Event(Event.GType.Say, $"test_{attackerPlayer.ClientID}", victimPlayer, attackerPlayer, S));
string[] eventLine = null; string[] eventLine = null;
for (int i = 0; i < 1; i++) for (int i = 0; i < 1; i++)

View File

@ -22,7 +22,7 @@ namespace SharedLibrary
abstract public void Init(); abstract public void Init();
protected bool Insert(String tableName, Dictionary<String, object> data) protected bool Insert(String tableName, Dictionary<String, object> data, bool ignore = false)
{ {
string names = ""; string names = "";
string parameters = ""; string parameters = "";
@ -36,10 +36,12 @@ namespace SharedLibrary
var Con = GetNewConnection(); var Con = GetNewConnection();
string ignoreCmd = ignore ? " OR IGNORE " : " ";
SQLiteCommand insertcmd = new SQLiteCommand() SQLiteCommand insertcmd = new SQLiteCommand()
{ {
Connection = Con, Connection = Con,
CommandText = String.Format("INSERT INTO `{0}` ({1}) VALUES ({2});", tableName, names, parameters) CommandText = String.Format("INSERT{0}INTO `{1}` ({2}) VALUES ({3});", ignoreCmd, tableName, names, parameters)
}; };
foreach (string key in data.Keys) foreach (string key in data.Keys)
{ {