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;
 | |
| }
 |