Rise
The Vieneo Province
DiscordRPC.cpp
Go to the documentation of this file.
1 #include "DiscordRPC.h"
2 
3 #include <ctime>
4 
5 #include "../Common/server.h"
6 
8 Bus* DiscordRPC::bus = nullptr;
9 Logger* DiscordRPC::logger = nullptr;
10 
11 void DiscordRPC::Trace(const char* msg, Logger::Level level = Logger::Level::Info)
12 {
13  char str[199];
14  sprintf_s(str, 199, "Discord: %s", msg);
15  logger->Log(str, level);
16 }
17 
18 void DiscordRPC::HandleDiscordReady(const DiscordUser* connectedUser)
19 {
20  char msg[199];
21  sprintf_s(msg, 199, "Connected to user %s#%s - %s", connectedUser->username, connectedUser->discriminator, connectedUser->userId);
22  Trace(msg);
23 
24  SPacketBig outpacket = SPacketBig();
25  outpacket.type = 2;
26  strcpy_s(outpacket.msg, sizeof outpacket.msg, connectedUser->userId);
27  network->SendToServer(&outpacket, sizeof SPacketBig, true);
28 }
29 
30 void DiscordRPC::HandleDiscordDisconnected(int errcode, const char* message)
31 {
32  char msg[199];
33  sprintf_s(msg, 199, "Disconnected (%d: %s)", errcode, message);
34  Trace(msg);
35 }
36 
37 void DiscordRPC::HandleDiscordError(int errcode, const char* message)
38 {
39  char msg[199];
40  sprintf_s(msg, 199, "Error (%d: %s)", errcode, message);
41  Trace(msg, Logger::Level::Error);
42 }
43 
44 void DiscordRPC::UpdatePresence(const char* prmDetails, const char* prmState, const char* prmLargeImageKey)
45 {
46  strcpy_s(details, 128, prmDetails);
47  strcpy_s(state, 128, prmState);
48  strcpy_s(largeImageKey, 32, prmLargeImageKey);
50 
51  Discord_UpdatePresence(&discordPresence);
52 }
53 
55 {
56  if (!discordPresence.startTimestamp)
57  discordPresence.startTimestamp = time(nullptr);
58 
59  largeImageKey[0] = largeImageText[0] = 0;
60  smallImageKey[0] = smallImageText[0] = 0;
61 
62  sprintf_s(smallImageKey, 32, "type%i", playerships[0].type);
63  switch (playerships[0].type)
64  {
65  case VehicleType::C98:
66  if (playerships[0].hullname[0])
67  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
68  else
69  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
70  strcpy_s(smallImageText, 128, "C-98 Construction MuVER");
71  break;
72  case VehicleType::E10:
73  if (playerships[0].hullname[0])
74  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
75  else
76  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
77  strcpy_s(smallImageText, 128, "E-10 Saint");
78  break;
79  case VehicleType::P13:
80  if (playerships[0].hullname[0])
81  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
82  else
83  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
84  strcpy_s(smallImageText, 128, "P-13 Prowler (Civilian)");
85  break;
86  case VehicleType::A4:
87  if (playerships[0].hullname[0])
88  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
89  else
90  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
91  strcpy_s(smallImageText, 128, "A-4 Wanderer");
92  break;
93  case VehicleType::C2:
94  if (playerships[0].hullname[0])
95  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
96  else
97  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
98  strcpy_s(smallImageText, 128, "C-2 Dasher");
99  break;
100  case VehicleType::T120:
101  if (playerships[0].hullname[0])
102  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
103  else
104  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
105  strcpy_s(smallImageText, 128, "T-120 Steerhead");
106  break;
107  case VehicleType::T121:
108  if (playerships[0].hullname[0])
109  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
110  else
111  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
112  strcpy_s(smallImageText, 128, "T-121 Steerhead");
113  break;
114  case VehicleType::E11:
115  if (playerships[0].hullname[0])
116  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
117  else
118  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
119  strcpy_s(smallImageText, 128, "E-11 Saint");
120  break;
121  case VehicleType::T27:
122  if (playerships[0].hullname[0])
123  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
124  else
125  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
126  strcpy_s(smallImageText, 128, "T-27 Mammoth");
127  break;
128  case VehicleType::C2A:
129  if (playerships[0].hullname[0])
130  sprintf_s(details, 128, "%s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
131  else
132  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
133  strcpy_s(smallImageText, 128, "C-2A Dasher");
134  break;
135  case VehicleType::W6Manx:
136  if (playerships[0].hullname[0])
137  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
138  else
139  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
140  strcpy_s(smallImageText, 128, "W-6 Manx");
141  break;
142  case VehicleType::T19:
143  if (playerships[0].hullname[0])
144  sprintf_s(details, 128, "USV %s (IVR %s)", playerships[0].hullname, playerships[0].IVR);
145  else
146  sprintf_s(details, 128, "IVR %s", playerships[0].IVR);
147  strcpy_s(smallImageText, 128, "T-19 Stratomaster");
148  break;
149  case VehicleType::Apartment:
150  strcpy_s(details, 128, "In their apartment");
151  strcpy_s(largeImageKey, 32, "apartment");
152  strcpy_s(largeImageText, 128, "Bradbury Apartments");
153  break;
154  case VehicleType::SimBay:
155  strcpy_s(details, 128, "In the simulator bay");
156  strcpy_s(largeImageKey, 32, "simulator");
157  strcpy_s(largeImageText, 128, "Simulator Bay");
158  break;
159  case VehicleType::ControlTower:
160  strcpy_s(details, 128, "In the control tower");
161  strcpy_s(largeImageKey, 32, "controltower");
162  strcpy_s(largeImageText, 128, "Control Tower");
163  break;
164  default:
165  sprintf_s(details, 128, "UNKNOWN VEHICLE TYPE %i", playerships[0].type);
166  break;
167  }
168 
169  if (playerships[0].reference == Reference::REF_ONGROUND)
170  {
171  if (gridarray[31][31].IsDeois())
172  {
173  sprintf_s(state, 128, "On the ground in Deois"); // could show lat/long
174  strcpy_s(largeImageKey, 32, "deois");
175  strcpy_s(largeImageText, 128, "City of Deois");
176  }
177  else if (gridarray[31][31].IsO4())
178  {
179  sprintf_s(state, 128, "On the ground at the O-4 ruins"); // could show lat/long
180  strcpy_s(largeImageKey, 32, "o4");
181  strcpy_s(largeImageText, 128, "O-4 Ruins");
182  }
183  else if (gridarray[31][31].type == PlotType::Arcridge)
184  {
185  sprintf_s(state, 128, "On the ground at Arcridge"); // could show lat/long
186  strcpy_s(largeImageKey, 32, "arcridge");
187  strcpy_s(largeImageText, 128, "Arcridge Correctional Facility");
188  }
189  else if (gridarray[31][31].type == PlotType::UserMining)
190  {
191  sprintf_s(state, 128, "On the ground at a mine"); // could show lat/long
192  strcpy_s(largeImageKey, 32, "mine");
193  strcpy_s(largeImageText, 128, "User Generated Mining Colony");
194  }
195  else if (gridarray[31][31].type == PlotType::UserTownship)
196  {
197  sprintf_s(state, 128, "On the ground at a township"); // could show lat/long
198  strcpy_s(largeImageKey, 32, "township");
199  strcpy_s(largeImageText, 128, "User Generated Township");
200  }
201  else if (gridarray[31][31].type == PlotType::UserFarming)
202  {
203  sprintf_s(state, 128, "On the ground at a farm"); // could show lat/long
204  strcpy_s(largeImageKey, 32, "farm");
205  strcpy_s(largeImageText, 128, "User Generated Farming Colony");
206  }
207  else if (gridarray[31][31].type == PlotType::UserEstate)
208  {
209  sprintf_s(state, 128, "On the ground at an estate"); // could show lat/long
210  strcpy_s(largeImageKey, 32, "estate");
211  strcpy_s(largeImageText, 128, "User Generated Estate");
212  }
213  else if (gridarray[31][31].type == PlotType::UserAirfield)
214  {
215  sprintf_s(state, 128, "On the ground at an airfield"); // could show lat/long
216  strcpy_s(largeImageKey, 32, "airfield");
217  strcpy_s(largeImageText, 128, "User Generated Airfield");
218  }
219  else if (gridarray[31][31].pri_landform == 1) // in the water
220  {
221  sprintf_s(state, 128, "In the drink"); // could show lat/long
222  strcpy_s(largeImageKey, 32, "water");
223  }
224  else
225  {
226  sprintf_s(state, 128, "On the ground"); // could show lat/long
227  strcpy_s(largeImageKey, 32, "land");
228  }
229  }
230  else if (playerships[0].reference == Reference::REF_APNMODE)
231  {
232  sprintf_s(state, 128, "%.0f m/s @ %.1f km MSL", bus->GroundSpeedKms * 1000.0f, bus->PressureAltitudeKm);
233  strcpy_s(largeImageKey, 32, "bcl");
234  }
235  else if (playerships[0].reference == Reference::REF_ACLMODE)
236  {
237  sprintf_s(state, 128, "%.1f km/s @ %.0f km MSL", bus->GroundSpeedKms, bus->PressureAltitudeKm);
238  strcpy_s(largeImageKey, 32, "acl");
239  }
240  else if (playerships[0].reference == REF_INANOTHER)
241  {
243  if (parent.type == VehicleType::T120 || parent.type == VehicleType::T121)
244  sprintf_s(state, 128, "Cargo bed of IVR %s", parent.IVR);
245  else
246  sprintf_s(state, 128, "Cargo bay of IVR %s", parent.IVR);
247  strcpy_s(largeImageKey, 32, "inanother");
248  }
249  else if (playerships[0].reference >= Reference::REF_DOCKCPOC)
250  {
251  if (playerships[0].docked)
252  {
253  switch (playerships[0].reference)
254  {
255  case Reference::REF_DOCKCPOC: sprintf_s(state, 128, "Docked at Cutter's Port (CPOC)"); break;
256  case Reference::REF_DOCKTAC: sprintf_s(state, 128, "Docked at Easydock (TAC)"); break;
257  default: sprintf_s(state, 128, "Docked at UNKNOWN %i", playerships[0].reference); break;
258  }
259  }
260  else
261  {
262  switch (playerships[0].reference)
263  {
264  case Reference::REF_DOCKCPOC: sprintf_s(state, 128, "Near Cutter's Port (CPOC)"); break;
265  case Reference::REF_DOCKTAC: sprintf_s(state, 128, "Near Easydock (TAC)"); break;
266  default: sprintf_s(state, 128, "Near UNKNOWN %i", playerships[0].reference); break;
267  }
268  }
269  switch (playerships[0].reference)
270  {
271  case Reference::REF_DOCKCPOC: sprintf_s(largeImageKey, 32, "cpoc"); break;
272  case Reference::REF_DOCKTAC: sprintf_s(largeImageKey, 32, "tac"); break;
273  }
274  }
275  else if (playerships[0].reference == Reference::REF_BUILDING || playerships[0].reference == Reference::REF_SIMBAY)
276  {
277  state[0] = 0;
278  // largeImageKey and largeImageText already set up in the VehicleTypes switch
279  }
280  else
281  {
282  sprintf_s(state, 128, "UNKNOWN REFERENCE %i", playerships[0].reference);
283  }
284 
285  // override for flight simulators
286  if (playerships[0].simulator)
287  {
288  strcpy_s(details, 128, "Flight Simulator");
289  strcpy_s(largeImageKey, 32, "simulator");
290  strcpy_s(largeImageText, 128, "Flight Simulator");
291  }
292 
293  Discord_UpdatePresence(&discordPresence);
294 }
295 
296 DiscordRPC::DiscordRPC(Networking* prmNetwork, Bus* prmBus, Logger* prmLogger)
297 {
298  network = prmNetwork;
299  bus = prmBus;
300  logger = prmLogger;
301 
302  memset(&handlers, 0, sizeof(handlers));
304  handlers.disconnected = HandleDiscordDisconnected;
305  handlers.errored = HandleDiscordError;
306 
307  Discord_Initialize("497844043951374357", &handlers, 1, "795990");
308 
309  memset(&discordPresence, 0, sizeof(discordPresence));
310  discordPresence.state = &state[0];
311  discordPresence.details = &details[0];
312  discordPresence.largeImageKey = &largeImageKey[0];
313  discordPresence.largeImageText = &largeImageText[0];
314  discordPresence.smallImageKey = &smallImageKey[0];
315  discordPresence.smallImageText = &smallImageText[0];
316 
317  UpdatePresence("Splash Screen", "Connecting and patching...", "splash");
318 }
319 
321 {
322  Discord_RunCallbacks();
323 }
char details[128]
Definition: DiscordRPC.h:24
DiscordEventHandlers handlers
Definition: DiscordRPC.h:15
Definition: Logger.h:9
void SendToServer(void *pData, DWORD dwSize, bool bGuaranteed, PacketOrdering order=ORDERING_NONE) const
Definition: Networking.cpp:59
static Networking * network
Definition: DiscordRPC.h:11
char largeImageKey[32]
Definition: DiscordRPC.h:25
s_network_objects playerships[MAX_SCAN]
Definition: globals.cpp:174
static void HandleDiscordDisconnected(int errcode, const char *message)
Definition: DiscordRPC.cpp:30
static void HandleDiscordReady(const DiscordUser *connectedUser)
Definition: DiscordRPC.cpp:18
float PressureAltitudeKm
Definition: Bus.h:25
static Logger * logger
Definition: DiscordRPC.h:13
char smallImageText[128]
Definition: DiscordRPC.h:28
Definition: Bus.h:16
char state[128]
Definition: DiscordRPC.h:23
static Bus * bus
Definition: DiscordRPC.h:12
static void Trace(const char *msg, Logger::Level level)
Definition: DiscordRPC.cpp:11
static void HandleDiscordError(int errcode, const char *message)
Definition: DiscordRPC.cpp:37
void Log(const char *msg, Level level=Info, int errorCode=0)
Definition: Logger.cpp:11
char largeImageText[128]
Definition: DiscordRPC.h:27
static void FrameMove()
Definition: DiscordRPC.cpp:320
void UpdatePresence(const char *prmDetails, const char *prmState, const char *prmLargeImageKey)
Definition: DiscordRPC.cpp:44
unsigned char type
Definition: globals.h:532
char smallImageKey[32]
Definition: DiscordRPC.h:26
float GroundSpeedKms
Definition: Bus.h:156
DiscordRichPresence discordPresence
Definition: DiscordRPC.h:16
void UpdateTelemetry()
Definition: DiscordRPC.cpp:54
LOCALGRID2 gridarray[64][64]
Definition: globals.cpp:153
Level
Definition: Logger.h:19
DiscordRPC(Networking *prmNetwork, Bus *prmBus, Logger *prmLogger)
Definition: DiscordRPC.cpp:296