1 module unecht.steamaccess;
2
3 version(EnableSteam):
4
5 import derelict.steamworks.steamworks;
6
7 import unecht.core.logger;
8
9 import std.conv:to;
10
11 ///
12 final class SteamAccess
13 {
14 this()
15 {
16 setup();
17 }
18
19 void setup()
20 {
21 DerelictSteamworks.load();
22
23 if(!SteamAPI_Init())
24 return log.warning("[Steam] client not running");
25
26 client = SteamClient();
27
28 if(!client)
29 return log.warning("[Steam] could not create client");
30
31 clientPipe = SteamAPI_ISteamClient_CreateSteamPipe(client);
32
33 if(!clientPipe)
34 return log.warning("[Steam] could not create clientPipe");
35
36 userPipe = SteamAPI_ISteamClient_ConnectToGlobalUser(client, clientPipe);
37
38 if(!userPipe)
39 return log.warning("[Steam] could not create userPipe");
40
41 utils = SteamAPI_ISteamClient_GetISteamUtils(client, clientPipe, STEAMUTILS_INTERFACE_VERSION);
42
43 if(!utils)
44 return log.warning("[Steam] could not create utils");
45
46 SteamAPI_ISteamUtils_SetWarningMessageHook(utils, &warnCallback);
47
48 screenshots = SteamAPI_ISteamClient_GetISteamScreenshots(client, userPipe, clientPipe, STEAMSCREENSHOTS_INTERFACE_VERSION);
49
50 if(!screenshots)
51 return log.warning("[Steam] could not create screenshots");
52
53 //TODO is that correct?
54 //SteamAPI_ISteamScreenshots_HookScreenshots(screenshots,true);
55
56 friends = SteamAPI_ISteamClient_GetISteamFriends(client, userPipe, clientPipe, STEAMFRIENDS_INTERFACE_VERSION);
57
58 if(!friends)
59 return log.warning("[Steam] could not create friends");
60
61 userName = to!string(SteamAPI_ISteamFriends_GetPersonaName(friends));
62
63 initialized = true;
64 log.infof("[Steam] up and running: '%s'",userName);
65 }
66
67 void openOverlay(/+string overlay = "Friends"+/)
68 {
69 if(!initialized) return;
70
71 SteamAPI_ISteamFriends_ActivateGameOverlay(friends, null);
72 }
73
74 void triggerScreenshot()
75 {
76 if(!initialized) return;
77
78 SteamAPI_ISteamScreenshots_TriggerScreenshot(screenshots);
79 }
80
81 void update()
82 {
83 if(!initialized) return;
84
85 SteamAPI_ISteamUtils_RunFrame(utils);
86 }
87
88 private static nothrow extern(C) void warnCallback(int severity, const char * str)
89 {
90 // make nothrow
91 try log.warningf("[Steam] Warn: %s (%s)", str, severity);
92 catch(Throwable){}
93 }
94
95 private:
96 ISteamFriends* friends;
97 ISteamUtils* utils;
98 ISteamScreenshots* screenshots;
99 ISteamClient* client;
100 HSteamPipe clientPipe;
101 HSteamPipe userPipe;
102
103 bool initialized = false;
104
105 string userName;
106 }