Client LuaCsForBarotrauma
BarotraumaShared/SharedSource/LuaCs/LuaCsNetworking.cs
1 using System;
2 using System.IO;
3 using System.Collections.Generic;
4 using System.Net.Http;
5 using System.Text;
7 
8 namespace Barotrauma
9 {
10  partial class LuaCsNetworking
11  {
12  private static readonly HttpClient client = new HttpClient();
13 
14  private enum LuaCsClientToServer
15  {
16  NetMessageId,
17  NetMessageString,
18  RequestSingleId,
19  RequestAllIds,
20  }
21 
22  private enum LuaCsServerToClient
23  {
24  NetMessageId,
25  NetMessageString,
26  ReceiveIds
27  }
28 
29  public bool RestrictMessageSize = true;
30 
31  private Dictionary<string, LuaCsAction> netReceives = new Dictionary<string, LuaCsAction>();
32  private Dictionary<ushort, string> idToString = new Dictionary<ushort, string>();
33  private Dictionary<string, ushort> stringToId = new Dictionary<string, ushort>();
34 
35  public void Initialize()
36  {
37 #if CLIENT
39 #endif
40  }
41 
42  public void Remove(string netMessageName)
43  {
44  netReceives.Remove(netMessageName);
45  }
46 
48  {
49  return new WriteOnlyMessage();
50  }
51 
52  public string IdToString(ushort id)
53  {
54  if (idToString.ContainsKey(id)) { return idToString[id]; }
55 
56  return null;
57  }
58 
59  public ushort StringToId(string name)
60  {
61  if (stringToId.ContainsKey(name)) { return stringToId[name]; }
62 
63  return 0;
64  }
65 
66  private void HandleNetMessage(IReadMessage netMessage, string name, Client client = null)
67  {
68  if (netReceives.ContainsKey(name))
69  {
70  try
71  {
72  netReceives[name](netMessage, client);
73  }
74  catch (Exception e)
75  {
76  LuaCsLogger.LogError($"Exception thrown inside NetMessageReceive({name})", LuaCsMessageOrigin.CSharpMod);
77  LuaCsLogger.HandleException(e, LuaCsMessageOrigin.CSharpMod);
78  }
79  }
80  else
81  {
82  if (GameSettings.CurrentConfig.VerboseLogging)
83  {
84 #if SERVER
85  LuaCsLogger.LogError($"Received NetMessage for unknown name {name} from {GameServer.ClientLogName(client)}.");
86 #else
87  LuaCsLogger.LogError($"Received NetMessage for unknown name {name} from server.");
88 #endif
89  }
90  }
91  }
92 
93  private void HandleNetMessageString(IReadMessage netMessage, Client client = null)
94  {
95  string name = netMessage.ReadString();
96 
97  HandleNetMessage(netMessage, name, client);
98  }
99 
100  public async void HttpRequest(string url, LuaCsAction callback, string data = null, string method = "POST", string contentType = "application/json", Dictionary<string, string> headers = null, string savePath = null)
101  {
102  try
103  {
104  HttpRequestMessage request = new HttpRequestMessage(new HttpMethod(method), url);
105 
106  if (headers != null)
107  {
108  foreach (var header in headers)
109  {
110  request.Headers.Add(header.Key, header.Value);
111  }
112  }
113 
114  if (data != null)
115  {
116  request.Content = new StringContent(data, Encoding.UTF8, contentType);
117  }
118 
119  HttpResponseMessage response = await client.SendAsync(request);
120 
121  if (savePath != null)
122  {
123  if (LuaCsFile.IsPathAllowedException(savePath))
124  {
125  byte[] responseData = await response.Content.ReadAsByteArrayAsync();
126 
127  using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write))
128  {
129  fileStream.Write(responseData, 0, responseData.Length);
130  }
131  }
132  }
133 
134  string responseBody = await response.Content.ReadAsStringAsync();
135 
136  GameMain.LuaCs.Timer.Wait((object[] par) =>
137  {
138  callback(responseBody, (int)response.StatusCode, response.Headers);
139  }, 0);
140  }
141  catch (HttpRequestException e)
142  {
143  GameMain.LuaCs.Timer.Wait((object[] par) => { callback(e.Message, e.StatusCode, null); }, 0);
144  }
145  catch (Exception e)
146  {
147  GameMain.LuaCs.Timer.Wait((object[] par) => { callback(e.Message, null, null); }, 0);
148  }
149  }
150 
151  public void HttpPost(string url, LuaCsAction callback, string data, string contentType = "application/json", Dictionary<string, string> headers = null, string savePath = null)
152  {
153  HttpRequest(url, callback, data, "POST", contentType, headers, savePath);
154  }
155 
156 
157  public void HttpGet(string url, LuaCsAction callback, Dictionary<string, string> headers = null, string savePath = null)
158  {
159  HttpRequest(url, callback, null, "GET", null, headers, savePath);
160  }
161 
163  {
164  GameMain.NetworkMember.CreateEntityEvent(entity, extraData);
165  }
166 
168  {
169  get { return GameMain.NetworkMember.LastClientListUpdateID; }
170  set { GameMain.NetworkMember.LastClientListUpdateID = value; }
171  }
172  }
173 }
static NetworkMember NetworkMember
Definition: GameMain.cs:190
static LuaCsSetup LuaCs
Definition: GameMain.cs:26
static bool IsPathAllowedException(string path, bool write=true, LuaCsMessageOrigin origin=LuaCsMessageOrigin.Unknown)
Definition: LuaCsUtility.cs:84
void HttpPost(string url, LuaCsAction callback, string data, string contentType="application/json", Dictionary< string, string > headers=null, string savePath=null)
void CreateEntityEvent(INetSerializable entity, NetEntityEvent.IData extraData)
async void HttpRequest(string url, LuaCsAction callback, string data=null, string method="POST", string contentType="application/json", Dictionary< string, string > headers=null, string savePath=null)
void HttpGet(string url, LuaCsAction callback, Dictionary< string, string > headers=null, string savePath=null)
void Wait(LuaCsAction action, int millisecondDelay)
Definition: LuaCsTimer.cs:110
delegate void LuaCsAction(params object[] args)