#pragma semicolon 1 #define DEBUG #define PLUGIN_AUTHOR "jenz" #define PLUGIN_VERSION "1.00" #include #include #include #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), "", "", 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; }