2017-05-26 18:49:27 -04:00
using System ;
using System.Collections.Generic ;
using System.Text ;
using SharedLibrary ;
2017-05-27 00:22:50 -04:00
using SharedLibrary.Interfaces ;
2017-05-26 18:49:27 -04:00
using System.Threading.Tasks ;
namespace EventAPI
{
class EventsJSON : IPage
{
private struct EventResponse
{
public int eventCount ;
public RestEvent Event ;
}
2017-06-12 13:50:00 -04:00
public string GetName ( )
2017-05-26 18:49:27 -04:00
{
return "Events" ;
}
2017-06-12 13:50:00 -04:00
public string GetPath ( )
2017-05-26 18:49:27 -04:00
{
return "/api/events" ;
}
2017-06-12 13:50:00 -04:00
public HttpResponse GetPage ( System . Collections . Specialized . NameValueCollection querySet , IDictionary < string , string > headers )
2017-05-26 18:49:27 -04:00
{
bool shouldQuery = querySet . Get ( "status" ) ! = null ;
EventResponse requestedEvent = new EventResponse ( ) ;
HttpResponse resp = new HttpResponse ( ) ;
if ( shouldQuery )
{
StringBuilder s = new StringBuilder ( ) ;
2017-06-12 13:50:00 -04:00
foreach ( var S in Events . ActiveServers )
2017-06-12 17:47:31 -04:00
s . Append ( String . Format ( "{0} has {1}/{4} players playing {2} on {3}\n" , S . Hostname , S . GetPlayersAsList ( ) . Count , Utilities . GetLocalizedGametype ( S . Gametype ) , S . CurrentMap . Name , S . MaxClients ) ) ;
2017-06-12 13:50:00 -04:00
requestedEvent . Event = new RestEvent ( RestEvent . EventType . STATUS , RestEvent . EventVersion . IW4MAdmin , s . ToString ( ) , "Status" , "" , "" ) ;
2017-05-26 18:49:27 -04:00
requestedEvent . eventCount = 1 ;
}
2017-06-12 13:50:00 -04:00
else if ( Events . APIEvents . Count > 0 )
2017-05-26 18:49:27 -04:00
{
2017-06-12 13:50:00 -04:00
requestedEvent . Event = Events . APIEvents . Dequeue ( ) ;
2017-05-26 18:49:27 -04:00
requestedEvent . eventCount = 1 ;
}
else
{
requestedEvent . eventCount = 0 ;
}
resp . content = Newtonsoft . Json . JsonConvert . SerializeObject ( requestedEvent ) ;
2017-06-12 13:50:00 -04:00
resp . contentType = GetContentType ( ) ;
2017-05-26 18:49:27 -04:00
resp . additionalHeaders = new Dictionary < string , string > ( ) ;
return resp ;
}
2017-06-12 13:50:00 -04:00
public string GetContentType ( )
2017-05-26 18:49:27 -04:00
{
return "application/json" ;
}
2017-06-12 13:50:00 -04:00
public bool Visible ( )
2017-05-26 18:49:27 -04:00
{
return false ;
}
}
class Events : IPlugin
{
2017-06-12 13:50:00 -04:00
public static Queue < RestEvent > APIEvents { get ; private set ; }
public static List < Server > ActiveServers ;
2017-05-26 18:49:27 -04:00
DateTime lastClear ;
int flaggedMessages ;
List < string > flaggedMessagesText ;
public String Name
{
get { return "Event API Plugin" ; }
}
public float Version
{
get { return 1.0f ; }
}
public string Author
{
get
{
return "RaidMax" ;
}
}
2017-10-16 23:47:41 -04:00
public async Task OnLoadAsync ( IManager manager )
2017-05-26 18:49:27 -04:00
{
2017-06-12 13:50:00 -04:00
APIEvents = new Queue < RestEvent > ( ) ;
2017-05-26 18:49:27 -04:00
flaggedMessagesText = new List < string > ( ) ;
2017-06-12 13:50:00 -04:00
ActiveServers = new List < Server > ( ) ;
WebService . PageList . Add ( new EventsJSON ( ) ) ;
2017-05-26 18:49:27 -04:00
}
2017-06-13 18:33:47 -04:00
public async Task OnUnloadAsync ( )
2017-05-26 18:49:27 -04:00
{
2017-06-12 13:50:00 -04:00
APIEvents . Clear ( ) ;
ActiveServers . Clear ( ) ;
2017-05-26 18:49:27 -04:00
}
2017-05-27 18:08:04 -04:00
public async Task OnTickAsync ( Server S )
2017-05-26 18:49:27 -04:00
{
return ;
}
2017-05-27 18:08:04 -04:00
public async Task OnEventAsync ( Event E , Server S )
2017-05-26 18:49:27 -04:00
{
if ( E . Type = = Event . GType . Start )
{
2017-06-12 13:50:00 -04:00
ActiveServers . Add ( S ) ;
2017-05-26 18:49:27 -04:00
}
if ( E . Type = = Event . GType . Stop )
{
2017-05-27 18:08:04 -04:00
// fixme: this will be bad once FTP is working and there can be multiple servers on the same port.
2017-06-12 13:50:00 -04:00
ActiveServers . RemoveAll ( s = > s . GetPort ( ) = = S . GetPort ( ) ) ;
2017-05-26 18:49:27 -04:00
}
if ( E . Type = = Event . GType . Connect )
{
2017-06-12 13:50:00 -04:00
AddRestEvent ( new RestEvent ( RestEvent . EventType . NOTIFICATION , RestEvent . EventVersion . IW4MAdmin , E . Origin . Name + " has joined " + S . Hostname , E . Type . ToString ( ) , S . Hostname , E . Origin . Name ) ) ;
2017-05-26 18:49:27 -04:00
}
if ( E . Type = = Event . GType . Disconnect )
{
2017-06-12 13:50:00 -04:00
AddRestEvent ( new RestEvent ( RestEvent . EventType . NOTIFICATION , RestEvent . EventVersion . IW4MAdmin , E . Origin . Name + " has left " + S . Hostname , E . Type . ToString ( ) , S . Hostname , E . Origin . Name ) ) ;
2017-05-26 18:49:27 -04:00
}
if ( E . Type = = Event . GType . Say )
{
if ( E . Data . Length ! = 0 & & E . Data [ 0 ] ! = '!' )
2017-06-12 13:50:00 -04:00
AddRestEvent ( new RestEvent ( RestEvent . EventType . NOTIFICATION , RestEvent . EventVersion . IW4MAdmin , E . Data , "Chat" , E . Origin . Name , "" ) ) ;
2017-05-26 18:49:27 -04:00
}
2017-11-13 16:58:23 -05:00
if ( E . Type = = Event . GType . Report )
{
AddRestEvent ( new RestEvent ( RestEvent . EventType . ALERT , RestEvent . EventVersion . IW4MAdmin , $"**{E.Origin.Name}** has reported **{E.Target.Name}** for: {E.Data.Trim()}" , E . Target . Name , E . Origin . Name , "" ) ) ;
}
2017-05-26 18:49:27 -04:00
if ( E . Type = = Event . GType . Say & & E . Origin . Level < Player . Permission . Moderator )
{
string message = E . Data . ToLower ( ) ;
2017-11-02 12:49:45 -04:00
bool flagged = message . Contains ( " wh " ) | |
2017-11-13 16:58:23 -05:00
message . Contains ( "hax" ) | |
message . Contains ( "cheat" ) | |
message . Contains ( " hack " ) | |
message . Contains ( "aim" ) | |
message . Contains ( "wall" ) | |
2017-11-02 12:49:45 -04:00
message . Contains ( "cheto" ) | |
2017-11-13 16:58:23 -05:00
message . Contains ( "hak" ) | |
message . Contains ( "bot" ) ;
2017-05-26 18:49:27 -04:00
if ( flagged )
{
flaggedMessages + + ;
flaggedMessagesText . Add ( String . Format ( "{0}: {1}" , E . Origin . Name , E . Data ) ) ;
}
if ( flaggedMessages > 3 )
{
await E . Owner . Broadcast ( "If you suspect someone of ^5CHEATING ^7use the ^5!report ^7command" ) ;
2017-06-12 13:50:00 -04:00
AddRestEvent ( new RestEvent ( RestEvent . EventType . ALERT , RestEvent . EventVersion . IW4MAdmin , "Chat indicates there may be a cheater" , "Alert" , E . Owner . Hostname , "" ) ) ;
AddRestEvent ( new RestEvent ( RestEvent . EventType . NOTIFICATION , RestEvent . EventVersion . IW4MAdmin , String . Join ( "\n" , flaggedMessagesText ) , "Chat Monitor" , E . Owner . Hostname , "" ) ) ;
2017-05-26 18:49:27 -04:00
flaggedMessages = 0 ;
}
else if ( ( DateTime . Now - lastClear ) . TotalMinutes > = 3 )
{
flaggedMessages = 0 ;
flaggedMessagesText . Clear ( ) ;
lastClear = DateTime . Now ;
}
}
}
2017-06-12 13:50:00 -04:00
public static void AddRestEvent ( RestEvent E )
2017-05-26 18:49:27 -04:00
{
2017-11-13 16:58:23 -05:00
if ( APIEvents . Count > 20 )
2017-06-12 13:50:00 -04:00
APIEvents . Dequeue ( ) ;
APIEvents . Enqueue ( E ) ;
2017-05-26 18:49:27 -04:00
}
}
}