362 lines
11 KiB
SourcePawn
362 lines
11 KiB
SourcePawn
#pragma semicolon 1
|
|
|
|
#define DEBUG
|
|
|
|
#define PLUGIN_AUTHOR "jenz"
|
|
#define PLUGIN_VERSION "1.00"
|
|
|
|
#include <sourcemod>
|
|
#include <sdktools>
|
|
#include <system2>
|
|
|
|
#pragma newdecls required
|
|
|
|
static char g_sEventURL[PLATFORM_MAX_PATH];
|
|
char c_EventContent[526][526];
|
|
bool b_eventLink[MAXPLAYERS];
|
|
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "unloze_EventScheduler",
|
|
author = PLUGIN_AUTHOR,
|
|
description = "Ingame Event Notifier",
|
|
version = PLUGIN_VERSION,
|
|
url = "www.unloze.com"
|
|
};
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: pluginstart/ mapstart
|
|
//----------------------------------------------------------------------------------------------------
|
|
|
|
public void OnPluginStart()
|
|
{
|
|
//commands
|
|
RegConsoleCmd("say", Cmd_Say);
|
|
RegAdminCmd("sm_event", Cmd_EventNotifier, ADMFLAG_GENERIC);
|
|
RegAdminCmd("sm_mapstartevent", Cmd_CheckEventInfo, ADMFLAG_ROOT);
|
|
|
|
//FilePath
|
|
BuildPath(Path_SM, g_sEventURL, sizeof(g_sEventURL), "configs/EventURL.txt");
|
|
}
|
|
|
|
public void OnMapStart()
|
|
{
|
|
EventInfo();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: timer notifications
|
|
//----------------------------------------------------------------------------------------------------
|
|
|
|
public Action EventCountDown(Handle timer)
|
|
{
|
|
//PrintToChatAll("c_EventContent[1]: %s", c_EventContent[1]);
|
|
//PrintToChatAll("c_EventContent[2]: %s", c_EventContent[2]);
|
|
CalculateTimeToNextEvent(c_EventContent[1], c_EventContent[2]);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: CalculateTimeToNextEvent
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void CalculateTimeToNextEvent(char[] content, char[] content1)
|
|
{
|
|
char sPart[2][526];
|
|
char sMonth[24];
|
|
char sDay[24];
|
|
char sHour[24];
|
|
char sMinute[24];
|
|
int i_Month;
|
|
int i_Day;
|
|
int i_Hour;
|
|
int i_Minute;
|
|
int months;
|
|
int days;
|
|
int hours;
|
|
int minutes;
|
|
FormatTime(sMonth, sizeof(sMonth), "%m");
|
|
FormatTime(sDay, sizeof(sDay), "%d");
|
|
FormatTime(sHour, sizeof(sHour), "%H");
|
|
FormatTime(sMinute, sizeof(sMinute), "%M");
|
|
TrimString(content);
|
|
TrimString(content1);
|
|
ExplodeString(content, "/", sPart, 2, 526);
|
|
//update we apperently need to know month
|
|
i_Day = StringToInt(sDay);
|
|
days = StringToInt(sPart[0]);
|
|
i_Month = StringToInt(sMonth);
|
|
ExplodeString(sPart[1], "/", sPart, 2, 526);
|
|
months = StringToInt(sPart[0]);
|
|
i_Hour = StringToInt(sHour);
|
|
hours = StringToInt(content1);
|
|
//PrintToChatAll("hours: %i", hours);
|
|
i_Minute = StringToInt(sMinute);
|
|
if (days >= i_Day || months > i_Month)
|
|
{
|
|
///SHIIIET
|
|
if (days >= i_Day)
|
|
{
|
|
days -= i_Day;
|
|
}
|
|
else if (i_Month == 1 || i_Month == 3 || i_Month == 5 || i_Month == 7 || i_Month == 8 || i_Month == 10 || i_Month == 12)
|
|
{
|
|
days += (31 - i_Day);
|
|
}
|
|
else if (i_Month == 2)
|
|
{
|
|
days += (28 - i_Day);
|
|
}
|
|
else
|
|
{
|
|
days += (30 - i_Day);
|
|
}
|
|
|
|
//from 12 to 24 or from 7 to 19 etc etc
|
|
hours += 12;
|
|
if (i_Hour > hours)
|
|
{
|
|
days -= 1;
|
|
hours = 24 - (i_Hour - hours);
|
|
//PrintToChatAll("if statement hours: %i", hours);
|
|
}
|
|
else
|
|
{
|
|
hours -= i_Hour;
|
|
//PrintToChatAll("else statement: hours: %i", hours);
|
|
}
|
|
//should solve one hour delay
|
|
if (hours != 0)
|
|
{
|
|
hours -= 1;
|
|
}
|
|
|
|
minutes = 60 - i_Minute;
|
|
PrintToChatAll("\x06[UNLOZE]\x03 Next Event is: Event# %s", c_EventContent[0]);
|
|
PrintToChatAll("\x06[UNLOZE]\x03 Taking Place in: %i Days, %i Hours, %i Minutes", days, hours, minutes);
|
|
PrintToChatAll("\x06[UNLOZE]\x03 Rewards: %s VIP", c_EventContent[3]);
|
|
}
|
|
else
|
|
{
|
|
//PrintToChatAll("days: %i \ni_Day: %i", days, i_Day);
|
|
//PrintToChatAll("months: %i \ni_Month: %i", months, i_Month);
|
|
PrintToChatAll("[UNLOZE] Waiting for next Event to be Scheduled...");
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: EventInfo
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void EventInfo()
|
|
{
|
|
//manual check if map event is read correctly on mapstart
|
|
Handle zonefile = INVALID_HANDLE;
|
|
char line[526];
|
|
//PrintToChatAll("g_sEventURL: %s", g_sEventURL);
|
|
zonefile = OpenFile(g_sEventURL, "r");
|
|
if (zonefile == INVALID_HANDLE)
|
|
{
|
|
//PrintToChatAll("Invalid handle");
|
|
return;
|
|
}
|
|
ReadFileLine(zonefile, line, sizeof(line));
|
|
//reading the link on every mapstart
|
|
ReplaceString(line, sizeof(line), "\"", "", false);
|
|
//PrintToChatAll("line: %s", line);
|
|
System2HTTPRequest httpRequest = new System2HTTPRequest(HttpResponseCallback, line);
|
|
httpRequest.GET();
|
|
delete httpRequest;
|
|
delete zonefile;
|
|
//5 minutes just
|
|
CreateTimer(300.0, EventCountDown, INVALID_HANDLE, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: cmds & menus
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action Cmd_CheckEventInfo(int client, any args)
|
|
{
|
|
EventInfo();
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
public Action Cmd_EventNotifier(int client, any args)
|
|
{
|
|
EventNotifierMenu(client);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
static void EventNotifierMenu(int client)
|
|
{
|
|
char c_local[526];
|
|
Format(c_local, sizeof(c_local), "Next Event: %s", c_EventContent[0]);
|
|
Menu EventMenu = CreateMenu(Event_Menu);
|
|
EventMenu.SetTitle("UNLOZE Event Scheduler");
|
|
EventMenu.AddItem("nothing here", c_local, ITEMDRAW_DISABLED);
|
|
EventMenu.AddItem("nothing here", "Link an Event");
|
|
EventMenu.ExitButton = true;
|
|
EventMenu.ExitBackButton = true;
|
|
EventMenu.Display(client, 30);
|
|
}
|
|
|
|
public int Event_Menu(Menu menu, MenuAction action, int client, int choice)
|
|
{
|
|
if (action == MenuAction_Select)
|
|
{
|
|
if (choice == 1)
|
|
{
|
|
PrintToChat(client, "Copy the Event link Into the chat!");
|
|
b_eventLink[client] = true;
|
|
}
|
|
else if (action == MenuAction_End)
|
|
{
|
|
delete(menu);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: simple say hook
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action Cmd_Say(int client, int args)
|
|
{
|
|
if (b_eventLink[client])
|
|
{
|
|
char arg[526];
|
|
GetCmdArgString(arg, sizeof(arg));
|
|
PrintToChat(client, "arg: %s", arg);
|
|
ReplaceString(arg, sizeof(arg), "\"", "", false);
|
|
System2HTTPRequest httpRequest = new System2HTTPRequest(HttpResponseCallback, arg);
|
|
httpRequest.GET();
|
|
delete httpRequest;
|
|
b_eventLink[client] = false;
|
|
|
|
Handle zonefile = INVALID_HANDLE;
|
|
zonefile = OpenFile(g_sEventURL, "w");
|
|
//one would think storing c_EventContent[0] could be better ohwell
|
|
WriteFileLine(zonefile, arg);
|
|
delete zonefile;
|
|
return Plugin_Handled;
|
|
}
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: http callbacks
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method)
|
|
{
|
|
if (success)
|
|
{
|
|
//PrintToChatAll("Success");
|
|
char content[526];
|
|
char content1[1080];
|
|
//for some horrifying reason this is inconsistent
|
|
for (int found = 0; found < response.ContentLength;)
|
|
{
|
|
found += response.GetContent(content, sizeof(content), found);
|
|
FindRelevantData(content);
|
|
}
|
|
for (int found = 0; found < response.ContentLength;)
|
|
{
|
|
found += response.GetContent(content1, sizeof(content1), found);
|
|
FindRelevantDataRewards(content1);
|
|
}
|
|
|
|
ReplaceString(c_EventContent[0], sizeof(c_EventContent), "<title>", "", false);
|
|
ReplaceString(c_EventContent[0], sizeof(c_EventContent), "| UNLOZE", "", false);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: Finds relevant data like event title, hours & days left, event rewards
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void FindRelevantDataRewards(char[] content)
|
|
{
|
|
if (StrContains(content, "Prize :", false) > -1)
|
|
{
|
|
//this is fragile as fuck
|
|
char sPart[2][526];
|
|
//PrintToChatAll("Prize content: %s", content);
|
|
ExplodeString(content, "Prize :", sPart, 2, 526);
|
|
//PrintToChatAll("sPart[1]: %s", sPart[1]);
|
|
//PrintToChatAll("sPart[0]: %s", sPart[0]);
|
|
c_EventContent[3] = sPart[1];
|
|
ExplodeString(c_EventContent[3], "VIP", sPart, 2, 526);
|
|
c_EventContent[3] = sPart[0];
|
|
ReplaceString(c_EventContent[3], sizeof(c_EventContent), "</span></b>", "");
|
|
PrintToChatAll("c_EventContent[3]: %s", c_EventContent[3]);
|
|
}
|
|
}
|
|
public void FindRelevantData(char[] content)
|
|
{
|
|
if (StrContains(content, "content=\"Event#", true) > -1)
|
|
{
|
|
char sPart[2][526];
|
|
//PrintToChatAll("content: %s", content);
|
|
//if event managers change formatting heads will roll
|
|
ExplodeString(content, "content=\"Event#", sPart, 2, 526);
|
|
//PrintToChatAll("sPart[0]: %s", sPart[0]);
|
|
//PrintToChatAll("sPart[1]: %s", sPart[1]);
|
|
c_EventContent[0] = sPart[1];
|
|
ExplodeString(c_EventContent[0], "\"/>", sPart, 2, 526);
|
|
//PrintToChatAll("POST sPart[0]: %s", sPart[0]);
|
|
c_EventContent[0] = sPart[0];
|
|
ReplaceString(c_EventContent[0], sizeof(c_EventContent), "amp;", "", false);
|
|
|
|
}
|
|
if (StrContains(content, "Date :", true) > -1)
|
|
{
|
|
//PrintToChatAll("StrContains Date :%s", content);
|
|
char sPart[2][526];
|
|
char c_localfix[526];
|
|
//PrintToChatAll("c_EventContent[1] Pre: %s", c_EventContent[1]);
|
|
//THIS IS FIIIINE
|
|
ExplodeString(content, "Date :", sPart, 2, 526);
|
|
c_localfix = sPart[1];
|
|
//PrintToChatAll("Date c_localfix: %s", c_localfix);
|
|
ExplodeString(c_localfix, "</span><br/>", sPart, 2, 526);
|
|
c_localfix = sPart[0];
|
|
TrimString(c_localfix);
|
|
if (StrContains(c_localfix, "'\">") > -1)
|
|
{
|
|
ExplodeString(c_localfix, "'\">", sPart, 2, 526);
|
|
}
|
|
else if (StrContains(c_localfix, "</b></span>") > -1)
|
|
{
|
|
ExplodeString(c_localfix, "</b></span>", sPart, 2, 526);
|
|
}
|
|
//PrintToChatAll("</span><br/> c_localfix: %s", c_localfix);
|
|
//PrintToChatAll("POST Day sPart[0]: %s", sPart[0]);
|
|
c_EventContent[1] = sPart[1];
|
|
ReplaceString(c_EventContent[1], sizeof(c_EventContent), "</span></span>", "");
|
|
PrintToChatAll("c_EventContent[1]: %s", c_EventContent[1]);
|
|
}
|
|
if (StrContains(content, "Time :", true) > -1)
|
|
{
|
|
char sPart[2][526];
|
|
//if event managers change formatting heads will roll
|
|
SplitString(content, " pm GMT+2", c_EventContent[2], sizeof(c_EventContent));
|
|
//THIS IS FIIIINE
|
|
ExplodeString(c_EventContent[2], "pm GMT+1", sPart, 2, 526);
|
|
//PrintToChatAll("hour sPart[0]: %s", sPart[0]);
|
|
c_EventContent[2] = sPart[1];
|
|
ReplaceString(c_EventContent[2], sizeof(c_EventContent), "/", "", false);
|
|
TrimString(c_EventContent[2]);
|
|
PrintToChatAll("c_EventContent[2]: %s", c_EventContent[2]);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose: OnClientPostAdminCheck && disconnect
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnClientPostAdminCheck(int client)
|
|
{
|
|
b_eventLink[client] = false;
|
|
}
|
|
|
|
public void OnClientDisconnect(int client)
|
|
{
|
|
b_eventLink[client] = false;
|
|
}
|