Add EventNotifier

This commit is contained in:
2026-09-28 21:40:26 +01:00
parent fc64e0ca07
commit 41f86102e5
4 changed files with 940 additions and 0 deletions
@@ -0,0 +1,225 @@
#include <sourcemod>
#include <EventNotifier>
#pragma semicolon 1
#pragma newdecls required
#define PLUGIN_VERSION "1.1"
#define CHAT_PREFIX "\x04[Events]\x01"
#define PANEL_LINE_WIDTH 60
#define KEY_BACK 8
#define KEY_EXIT 10
public Plugin myinfo =
{
name = "EventNotifier Menu",
author = "marisakirisame.net",
description = "Shows upcoming Unloze events in-game via sm_event",
version = PLUGIN_VERSION,
url = "https://marisakirisame.net"
};
public void OnPluginStart()
{
RegConsoleCmd("sm_event", Command_EventMenu, "Shows upcoming Unloze events. Usage: sm_event [event number]");
RegConsoleCmd("sm_events", Command_EventMenu, "Shows upcoming Unloze events. Usage: sm_events [event number]");
}
// ---------------------------------------------------------------------------
// Commands
// ---------------------------------------------------------------------------
public Action Command_EventMenu(int client, int args)
{
if (client <= 0 || !IsClientInGame(client))
{
ReplyToCommand(client, "This command can only be used in-game.");
return Plugin_Handled;
}
if (EventNotifier_GetEventCount() == 0)
{
if (EventNotifier_HasFetched())
PrintToChat(client, "%s There are no upcoming events.", CHAT_PREFIX);
else
PrintToChat(client, "%s The event list is not available right now, try again later.", CHAT_PREFIX);
return Plugin_Handled;
}
if (args >= 1)
{
char arg[16];
GetCmdArg(1, arg, sizeof(arg));
int number = StringToInt(arg);
int index = EventNotifier_FindEventByNumber(number);
if (index == -1)
{
PrintToChat(client, "%s Event #%d is not in the upcoming list.", CHAT_PREFIX, number);
return Plugin_Handled;
}
ShowEventDetails(client, index);
return Plugin_Handled;
}
ShowEventList(client);
return Plugin_Handled;
}
// ---------------------------------------------------------------------------
// Menus
// ---------------------------------------------------------------------------
void ShowEventList(int client)
{
Menu menu = new Menu(EventList_Handler);
menu.SetTitle("Upcoming Unloze events");
int count = EventNotifier_GetEventCount();
for (int i = 0; i < count; i++)
{
EventInfo ev;
if (!EventNotifier_GetEvent(i, ev))
continue;
char info[16], display[EVENT_STR_LEN + 16];
IntToString(ev.number, info, sizeof(info));
Format(display, sizeof(display), "%d: %s", ev.number, ev.name);
menu.AddItem(info, display);
}
menu.ExitButton = true;
menu.Display(client, MENU_TIME_FOREVER);
}
public int EventList_Handler(Menu menu, MenuAction action, int param1, int param2)
{
switch (action)
{
case MenuAction_Select:
{
char info[16];
menu.GetItem(param2, info, sizeof(info));
int index = EventNotifier_FindEventByNumber(StringToInt(info));
if (index == -1)
{
PrintToChat(param1, "%s That event is no longer in the upcoming list.", CHAT_PREFIX);
ShowEventList(param1);
}
else
{
ShowEventDetails(param1, index);
}
}
case MenuAction_End:
{
delete menu;
}
}
return 0;
}
void ShowEventDetails(int client, int index)
{
EventInfo ev;
if (!EventNotifier_GetEvent(index, ev))
{
PrintToChat(client, "%s That event is no longer in the upcoming list.", CHAT_PREFIX);
return;
}
char line[EVENT_STR_LEN + 32];
Panel panel = new Panel();
Format(line, sizeof(line), "Event #%d: %s", ev.number, ev.name);
panel.SetTitle(line);
panel.DrawText(" ");
if (ev.start > 0)
{
char when[64];
FormatTime(when, sizeof(when), "%a %d %b %Y, %H:%M %Z", ev.start);
Format(line, sizeof(line), "Date: %s", when);
panel.DrawText(line);
EventNotifier_FormatRelativeTime(ev.start, ev.end, line, sizeof(line));
panel.DrawText(line);
}
else
{
panel.DrawText("Date: unknown");
}
Format(line, sizeof(line), "Server: %s", ev.server[0] ? ev.server : "unknown");
panel.DrawText(line);
if (ev.maps[0])
DrawWrappedList(panel, "Maps: ", ev.maps);
else
panel.DrawText("Maps: none listed");
Format(line, sizeof(line), "Rewards: %s", ev.rewards[0] ? ev.rewards : "none");
panel.DrawText(line);
Format(line, sizeof(line), "Leader: %s", ev.leader[0] ? ev.leader : "none");
panel.DrawText(line);
Format(line, sizeof(line), "Kickers: %s", ev.kickers[0] ? ev.kickers : "none");
panel.DrawText(line);
panel.DrawText(" ");
panel.CurrentKey = KEY_BACK;
panel.DrawItem("Back");
panel.CurrentKey = KEY_EXIT;
panel.DrawItem("Exit");
panel.Send(client, EventDetails_Handler, MENU_TIME_FOREVER);
delete panel;
}
public int EventDetails_Handler(Menu menu, MenuAction action, int param1, int param2)
{
if (action == MenuAction_Select && param2 == KEY_BACK)
{
if (IsClientInGame(param1))
Command_EventMenu(param1, 0);
}
return 0;
}
// Draws "prefix a, b, c" and continues onto new indented lines when a line
// would exceed PANEL_LINE_WIDTH characters, splitting only at the commas.
void DrawWrappedList(Panel panel, const char[] prefix, const char[] list)
{
char parts[32][128];
int count = ExplodeString(list, ", ", parts, sizeof(parts), sizeof(parts[]));
char line[PANEL_LINE_WIDTH + 160];
strcopy(line, sizeof(line), prefix);
bool lineHasItems = false;
for (int i = 0; i < count; i++)
{
char item[132];
strcopy(item, sizeof(item), parts[i]);
if (i < count - 1)
StrCat(item, sizeof(item), ",");
if (lineHasItems && strlen(line) + 1 + strlen(item) > PANEL_LINE_WIDTH)
{
panel.DrawText(line);
strcopy(line, sizeof(line), " ");
lineHasItems = false;
}
else if (lineHasItems)
{
StrCat(line, sizeof(line), " ");
}
StrCat(line, sizeof(line), item);
lineHasItems = true;
}
if (lineHasItems)
panel.DrawText(line);
}