SMJSONAPI: Add Forwards
This commit is contained in:
		
							parent
							
								
									802ef98c0c
								
							
						
					
					
						commit
						2d336798e2
					
				
							
								
								
									
										13
									
								
								SMJSONAPI/scripting/Forwards.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								SMJSONAPI/scripting/Forwards.inc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | 
 | ||||||
|  | public void OnClientPostAdminCheck(int client) | ||||||
|  | { | ||||||
|  | 	JSONObject jEvent = new JSONObject(); | ||||||
|  | 	jEvent.SetString("name", "OnClientPostAdminCheck"); | ||||||
|  | 
 | ||||||
|  | 	JSONObject jEventData = new JSONObject(); | ||||||
|  | 	jEventData.SetInt("client", client); | ||||||
|  | 
 | ||||||
|  | 	jEvent.Set("data", jEventData); | ||||||
|  | 
 | ||||||
|  | 	Subscribe_Forwards_Publish("OnClientPostAdminCheck", jEvent); | ||||||
|  | } | ||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "GameEvents.inc"
 | #include "GameEvents.inc"
 | ||||||
|  | #include "Forwards.inc"
 | ||||||
| 
 | 
 | ||||||
| #define MAX_SUBSCRIBERS MAX_CLIENTS
 | #define MAX_SUBSCRIBERS MAX_CLIENTS
 | ||||||
| 
 | 
 | ||||||
| @ -7,12 +8,14 @@ enum | |||||||
| 	eSubscribeError_OutOfRange = -1, | 	eSubscribeError_OutOfRange = -1, | ||||||
| 	eSubscribeError_Inactive = -2, | 	eSubscribeError_Inactive = -2, | ||||||
| 	eSubscribeError_GameEvent = -3, | 	eSubscribeError_GameEvent = -3, | ||||||
|  | 	eSubscribeError_Forward = -4, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool g_Subscriber_Active[MAX_SUBSCRIBERS] = { false, ... }; | static bool g_Subscriber_Active[MAX_SUBSCRIBERS] = { false, ... }; | ||||||
| static int g_Subscriber_Client[MAX_SUBSCRIBERS] = { -1, ... }; | static int g_Subscriber_Client[MAX_SUBSCRIBERS] = { -1, ... }; | ||||||
| 
 | 
 | ||||||
| static ArrayList g_Subscriber_GameEvents[MAX_SUBSCRIBERS]; | static ArrayList g_Subscriber_GameEvents[MAX_SUBSCRIBERS]; | ||||||
|  | static ArrayList g_Subscriber_Forwards[MAX_SUBSCRIBERS]; | ||||||
| 
 | 
 | ||||||
| bool Subscribe_OnPluginStart() | bool Subscribe_OnPluginStart() | ||||||
| { | { | ||||||
| @ -33,6 +36,7 @@ int Subscriber_Create(int Client) | |||||||
| 	g_Subscriber_Client[Index] = Client; | 	g_Subscriber_Client[Index] = Client; | ||||||
| 
 | 
 | ||||||
| 	g_Subscriber_GameEvents[Index] = new ArrayList(ByteCountToCells(32)); | 	g_Subscriber_GameEvents[Index] = new ArrayList(ByteCountToCells(32)); | ||||||
|  | 	g_Subscriber_Forwards[Index] = new ArrayList(ByteCountToCells(32)); | ||||||
| 
 | 
 | ||||||
| 	return Index; | 	return Index; | ||||||
| } | } | ||||||
| @ -53,6 +57,7 @@ int Subscriber_Destroy(int Index) | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	delete g_Subscriber_GameEvents[Index]; | 	delete g_Subscriber_GameEvents[Index]; | ||||||
|  | 	delete g_Subscriber_Forwards[Index]; | ||||||
| 
 | 
 | ||||||
| 	g_Subscriber_Active[Index] = false; | 	g_Subscriber_Active[Index] = false; | ||||||
| 	g_Subscriber_Client[Index] = -1; | 	g_Subscriber_Client[Index] = -1; | ||||||
| @ -122,6 +127,54 @@ int Subscriber_HandleRequest(int Index, JSONObject Request, JSONObject Response) | |||||||
| 		Response.Set("events", EventArrayResponse); | 		Response.Set("events", EventArrayResponse); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  | 	else if(StrEqual(sModule, "forwards")) | ||||||
|  | 	{ | ||||||
|  | 		JSONArray EventArray = view_as<JSONArray>(Request.Get("events")); | ||||||
|  | 		if(EventArray == null || !EventArray.IsArray) | ||||||
|  | 		{ | ||||||
|  | 			delete EventArray; | ||||||
|  | 			JSONObject jError = new JSONObject(); | ||||||
|  | 			jError.SetString("error", "Request has no 'events' array-value."); | ||||||
|  | 			Response.Set("error", jError); | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		int Method = 0; | ||||||
|  | 		if(StrEqual(sMethod, "subscribe")) | ||||||
|  | 			Method = 1; | ||||||
|  | 		else if(StrEqual(sMethod, "unsubscribe")) | ||||||
|  | 			Method = 2; | ||||||
|  | 		else if(StrEqual(sMethod, "replay")) | ||||||
|  | 			Method = 3; | ||||||
|  | 
 | ||||||
|  | 		JSONArray EventArrayResponse = new JSONArray(); | ||||||
|  | 
 | ||||||
|  | 		for(int i = 0; i < EventArray.Length; i++) | ||||||
|  | 		{ | ||||||
|  | 			static char sEventName[32]; | ||||||
|  | 			if(EventArray.GetString(i, sEventName, sizeof(sEventName)) < 0) | ||||||
|  | 			{ | ||||||
|  | 				JSONObject jError = new JSONObject(); | ||||||
|  | 				jError.SetString("error", "not a string-value"); | ||||||
|  | 				EventArrayResponse.Append(jError); | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			int Res; | ||||||
|  | 			if(Method == 1) | ||||||
|  | 				Res = Subscribe_Forwards_Subscribe(Index, sEventName); | ||||||
|  | 			else if(Method == 2) | ||||||
|  | 				Res = Subscribe_Forwards_Unsubscribe(Index, sEventName); | ||||||
|  | 			else if(Method == 3) | ||||||
|  | 				Res = Subscribe_Forwards_Replay(Index, sEventName); | ||||||
|  | 
 | ||||||
|  | 			EventArrayResponse.AppendInt(Res); | ||||||
|  | 		} | ||||||
|  | 		delete EventArray; | ||||||
|  | 
 | ||||||
|  | 		Response.Set("events", EventArrayResponse); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	JSONObject jError = new JSONObject(); | 	JSONObject jError = new JSONObject(); | ||||||
| 	jError.SetString("error", "No handler found for requested module."); | 	jError.SetString("error", "No handler found for requested module."); | ||||||
| @ -275,3 +328,109 @@ void Subscribe_GameEvents_Publish(const char[] sEventName, JSONObject jEvent) | |||||||
| 	delete jPublish; | 	delete jPublish; | ||||||
| } | } | ||||||
| /* GameEvents */ | /* GameEvents */ | ||||||
|  | 
 | ||||||
|  | /* Forwards */ | ||||||
|  | static int Subscribe_Forwards_Subscribe(int Index, const char[] sEventName) | ||||||
|  | { | ||||||
|  | 	if(Index < 0 || Index >= MAX_SUBSCRIBERS) | ||||||
|  | 		return eSubscribeError_OutOfRange; | ||||||
|  | 
 | ||||||
|  | 	if(!g_Subscriber_Active[Index]) | ||||||
|  | 		return eSubscribeError_Inactive; | ||||||
|  | 
 | ||||||
|  | 	int Find = g_Subscriber_Forwards[Index].FindString(sEventName); | ||||||
|  | 	if(Find != -1) | ||||||
|  | 		return Find; | ||||||
|  | 
 | ||||||
|  | 	// TODO: forward exists?
 | ||||||
|  | 
 | ||||||
|  | 	return g_Subscriber_Forwards[Index].PushString(sEventName); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int Subscribe_Forwards_Unsubscribe(int Index, const char[] sEventName) | ||||||
|  | { | ||||||
|  | 	if(Index < 0 || Index >= MAX_SUBSCRIBERS) | ||||||
|  | 		return eSubscribeError_OutOfRange; | ||||||
|  | 
 | ||||||
|  | 	if(!g_Subscriber_Active[Index]) | ||||||
|  | 		return eSubscribeError_Inactive; | ||||||
|  | 
 | ||||||
|  | 	int Find = g_Subscriber_Forwards[Index].FindString(sEventName); | ||||||
|  | 	if(Find == -1) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	g_Subscriber_Forwards[Index].Erase(Find); | ||||||
|  | 	return Find; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int Subscribe_Forwards_Replay(int Index, const char[] sEventName) | ||||||
|  | { | ||||||
|  | 	if(Index < 0 || Index >= MAX_SUBSCRIBERS) | ||||||
|  | 		return eSubscribeError_OutOfRange; | ||||||
|  | 
 | ||||||
|  | 	if(!g_Subscriber_Active[Index]) | ||||||
|  | 		return eSubscribeError_Inactive; | ||||||
|  | 
 | ||||||
|  | 	if(StrEqual(sEventName, "OnClientPostAdminCheck")) | ||||||
|  | 	{ | ||||||
|  | 		for(int client = 1; client <= MaxClients; client++) | ||||||
|  | 		{ | ||||||
|  | 			if(!IsClientInGame(client) || !IsClientAuthorized(client)) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
|  | 			JSONObject jEventData = new JSONObject(); | ||||||
|  | 			jEventData.SetInt("client", client); | ||||||
|  | 
 | ||||||
|  | 			Subscribe_Forwards_FakePublish(g_Subscriber_Client[Index], sEventName, jEventData); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		return eSubscribeError_Forward; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int Subscribe_Forwards_FakePublish(int Index, const char[] sEventName, JSONObject jEventData) | ||||||
|  | { | ||||||
|  | 	if(Index < 0 || Index >= MAX_SUBSCRIBERS) | ||||||
|  | 		return eSubscribeError_OutOfRange; | ||||||
|  | 
 | ||||||
|  | 	if(!g_Subscriber_Active[Index]) | ||||||
|  | 		return eSubscribeError_Inactive; | ||||||
|  | 
 | ||||||
|  | 	JSONObject jEvent = new JSONObject(); | ||||||
|  | 	jEvent.SetString("name", sEventName); | ||||||
|  | 	jEvent.Set("data", jEventData); | ||||||
|  | 
 | ||||||
|  | 	JSONObject jPublish = new JSONObject(); | ||||||
|  | 	jPublish.SetString("method", "publish"); | ||||||
|  | 	jPublish.SetString("module", "forwards"); | ||||||
|  | 	jPublish.Set("event", jEvent); | ||||||
|  | 
 | ||||||
|  | 	PublishEvent(g_Subscriber_Client[Index], jPublish); | ||||||
|  | 	delete jPublish; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Subscribe_Forwards_Publish(const char[] sEventName, JSONObject jEvent) | ||||||
|  | { | ||||||
|  | 	JSONObject jPublish = new JSONObject(); | ||||||
|  | 	jPublish.SetString("method", "publish"); | ||||||
|  | 	jPublish.SetString("module", "forwards"); | ||||||
|  | 	jPublish.Set("event", jEvent); | ||||||
|  | 
 | ||||||
|  | 	for(int Index = 0; Index < MAX_SUBSCRIBERS; Index++) | ||||||
|  | 	{ | ||||||
|  | 		if(!g_Subscriber_Active[Index]) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		if(g_Subscriber_Forwards[Index].FindString(sEventName) == -1) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		PublishEvent(g_Subscriber_Client[Index], jPublish); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	delete jPublish; | ||||||
|  | } | ||||||
|  | /* Forwards */ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user