Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
94ee4e64d9 | |||
bd294d51a8 | |||
b85758ec19 | |||
ec6af6132d | |||
f99a260b07 | |||
2c609b1d5f | |||
839ba32671 | |||
6a59509b7b | |||
b0e31a9e25 | |||
2d0661c906 | |||
265ea814f5 | |||
8990824c9c | |||
8f9013cea6 | |||
085e0e7326 | |||
b3102db5c9 | |||
5438d6bf22 | |||
b9f9b08606 | |||
e5bdd61223 | |||
1555405d83 | |||
051a1eeb70 | |||
3852d83d12 | |||
d8122e7d69 | |||
060182f366 |
11
README.md
11
README.md
@ -7,7 +7,7 @@ have callbacks for where a more complete game would do more things (joining, spe
|
|||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The most up to date documentation for Rich Presence can always be found in our [developer site](https://discordapp.com/developers/docs/topics/rich-presence)!
|
The most up to date documentation for Rich Presence can always be found in our [developer site](https://discordapp.com/developers/docs/rich-presence/how-to)!
|
||||||
|
|
||||||
## Basic Usage
|
## Basic Usage
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ There's a [CMake](https://cmake.org/download/) file that should be able to gener
|
|||||||
```
|
```
|
||||||
There is a wrapper build script `build.py` that runs `cmake` with a few different options.
|
There is a wrapper build script `build.py` that runs `cmake` with a few different options.
|
||||||
|
|
||||||
Usually, I run `build.py` to get things started, then use the generated project files as I work on things.
|
Usually, I run `build.py` to get things started, then use the generated project files as I work on things. It does depend on `click` library, so do a quick `pip install click` to make sure you have it if you want to run `build.py`.
|
||||||
|
|
||||||
There are some CMake options you might care about:
|
There are some CMake options you might care about:
|
||||||
|
|
||||||
@ -75,4 +75,9 @@ Below is a table of unofficial, community-developed wrappers for and implementat
|
|||||||
|
|
||||||
| Name | Language |
|
| Name | Language |
|
||||||
|------|----------|
|
|------|----------|
|
||||||
| Be the first! | |
|
| [discord-rpc.jar](https://github.com/Vatuu/discord-rpc "Discord-RPC.jar") | Java |
|
||||||
|
| [java-discord-rpc](https://github.com/MinnDevelopment/java-discord-rpc) | Java |
|
||||||
|
| [Discord-IPC](https://github.com/jagrosh/DiscordIPC) | Java |
|
||||||
|
| [Discord Rich Presence](https://npmjs.org/discord-rich-presence) | JavaScript |
|
||||||
|
| [drpc4k](https://github.com/Bluexin/drpc4k) | [Kotlin](https://kotlinlang.org/) |
|
||||||
|
| [SwordRPC](https://github.com/Azoy/SwordRPC) | [Swift](https://swift.org) |
|
||||||
|
31
build.py
31
build.py
@ -87,9 +87,34 @@ def for_unity(ctx):
|
|||||||
|
|
||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
def unreal():
|
@click.pass_context
|
||||||
""" todo: build unreal project """
|
def unreal(ctx):
|
||||||
pass
|
""" build libs and copy them into the unreal project """
|
||||||
|
ctx.invoke(
|
||||||
|
libs,
|
||||||
|
clean=False,
|
||||||
|
static=False,
|
||||||
|
shared=True,
|
||||||
|
skip_formatter=True,
|
||||||
|
just_release=True
|
||||||
|
)
|
||||||
|
|
||||||
|
click.echo('--- Copying libs and header into unreal example')
|
||||||
|
|
||||||
|
UNREAL_PROJECT_PATH = os.path.join(SCRIPT_PATH, 'examples', 'unrealstatus', 'Plugins', 'discordrpc')
|
||||||
|
BUILD_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'win64-dynamic', 'src', 'Release')
|
||||||
|
|
||||||
|
UNREAL_DLL_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Win64')
|
||||||
|
mkdir_p(UNREAL_DLL_PATH)
|
||||||
|
shutil.copy(os.path.join(BUILD_BASE_PATH, 'discord-rpc.dll'), UNREAL_DLL_PATH)
|
||||||
|
|
||||||
|
UNREAL_INCLUDE_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Include')
|
||||||
|
mkdir_p(UNREAL_INCLUDE_PATH)
|
||||||
|
shutil.copy(os.path.join(SCRIPT_PATH, 'include', 'discord-rpc.h'), UNREAL_INCLUDE_PATH)
|
||||||
|
|
||||||
|
UNREAL_LIB_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Win64')
|
||||||
|
mkdir_p(UNREAL_LIB_PATH)
|
||||||
|
shutil.copy(os.path.join(BUILD_BASE_PATH, 'discord-rpc.lib'), UNREAL_LIB_PATH)
|
||||||
|
|
||||||
|
|
||||||
def build_lib(build_name, generator, options, just_release):
|
def build_lib(build_name, generator, options, just_release):
|
||||||
|
@ -66,7 +66,7 @@ First is the `ACTIVITY_JOIN` event:
|
|||||||
"data": {
|
"data": {
|
||||||
"secret": "025ed05c71f639de8bfaa0d679d7c94b2fdce12f"
|
"secret": "025ed05c71f639de8bfaa0d679d7c94b2fdce12f"
|
||||||
},
|
},
|
||||||
"evnt": "ACTIVITY_JOIN"
|
"evt": "ACTIVITY_JOIN"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ Second is the `ACTIVITY_SPECTATE` event:
|
|||||||
"data": {
|
"data": {
|
||||||
"secret": "e7eb30d2ee025ed05c71ea495f770b76454ee4e0"
|
"secret": "e7eb30d2ee025ed05c71ea495f770b76454ee4e0"
|
||||||
},
|
},
|
||||||
"evnt": "ACTIVITY_SPECTATE"
|
"evt": "ACTIVITY_SPECTATE"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ And third is the `ACTIVITY_JOIN_REQUEST` event:
|
|||||||
},
|
},
|
||||||
"secret": "e459ca99273f59909dd16ed97865f3ad"
|
"secret": "e459ca99273f59909dd16ed97865f3ad"
|
||||||
},
|
},
|
||||||
"evnt": "ACTIVITY_JOIN_REQUEST"
|
"evt": "ACTIVITY_JOIN_REQUEST"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -16,8 +16,10 @@ public class DiscordController : MonoBehaviour
|
|||||||
public string optionalSteamId;
|
public string optionalSteamId;
|
||||||
public int callbackCalls;
|
public int callbackCalls;
|
||||||
public int clickCounter;
|
public int clickCounter;
|
||||||
|
public DiscordRpc.JoinRequest joinRequest;
|
||||||
public UnityEngine.Events.UnityEvent onConnect;
|
public UnityEngine.Events.UnityEvent onConnect;
|
||||||
public UnityEngine.Events.UnityEvent onDisconnect;
|
public UnityEngine.Events.UnityEvent onDisconnect;
|
||||||
|
public UnityEngine.Events.UnityEvent hasResponded;
|
||||||
public DiscordJoinEvent onJoin;
|
public DiscordJoinEvent onJoin;
|
||||||
public DiscordJoinEvent onSpectate;
|
public DiscordJoinEvent onSpectate;
|
||||||
public DiscordJoinRequestEvent onJoinRequest;
|
public DiscordJoinRequestEvent onJoinRequest;
|
||||||
@ -34,6 +36,20 @@ public class DiscordController : MonoBehaviour
|
|||||||
DiscordRpc.UpdatePresence(ref presence);
|
DiscordRpc.UpdatePresence(ref presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RequestRespondYes()
|
||||||
|
{
|
||||||
|
Debug.Log("Discord: responding yes to Ask to Join request");
|
||||||
|
DiscordRpc.Respond(joinRequest.userId, DiscordRpc.Reply.Yes);
|
||||||
|
hasResponded.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RequestRespondNo()
|
||||||
|
{
|
||||||
|
Debug.Log("Discord: responding no to Ask to Join request");
|
||||||
|
DiscordRpc.Respond(joinRequest.userId, DiscordRpc.Reply.No);
|
||||||
|
hasResponded.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
public void ReadyCallback()
|
public void ReadyCallback()
|
||||||
{
|
{
|
||||||
++callbackCalls;
|
++callbackCalls;
|
||||||
@ -72,6 +88,7 @@ public class DiscordController : MonoBehaviour
|
|||||||
{
|
{
|
||||||
++callbackCalls;
|
++callbackCalls;
|
||||||
Debug.Log(string.Format("Discord: join request {0}#{1}: {2}", request.username, request.discriminator, request.userId));
|
Debug.Log(string.Format("Discord: join request {0}#{1}: {2}", request.username, request.discriminator, request.userId));
|
||||||
|
joinRequest = request;
|
||||||
onJoinRequest.Invoke(request);
|
onJoinRequest.Invoke(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,9 @@ public class DiscordRpc
|
|||||||
[DllImport("discord-rpc", EntryPoint = "Discord_UpdatePresence", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("discord-rpc", EntryPoint = "Discord_UpdatePresence", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void UpdatePresence(ref RichPresence presence);
|
public static extern void UpdatePresence(ref RichPresence presence);
|
||||||
|
|
||||||
|
[DllImport("discord-rpc", EntryPoint = "Discord_ClearPresence", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void ClearPresence();
|
||||||
|
|
||||||
[DllImport("discord-rpc", EntryPoint = "Discord_Respond", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("discord-rpc", EntryPoint = "Discord_Respond", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void Respond(string userId, Reply reply);
|
public static extern void Respond(string userId, Reply reply);
|
||||||
}
|
}
|
||||||
|
@ -271,6 +271,80 @@ CanvasRenderer:
|
|||||||
m_PrefabParentObject: {fileID: 0}
|
m_PrefabParentObject: {fileID: 0}
|
||||||
m_PrefabInternal: {fileID: 0}
|
m_PrefabInternal: {fileID: 0}
|
||||||
m_GameObject: {fileID: 359174702}
|
m_GameObject: {fileID: 359174702}
|
||||||
|
--- !u!1 &520806049
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 520806050}
|
||||||
|
- component: {fileID: 520806052}
|
||||||
|
- component: {fileID: 520806051}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: Text
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &520806050
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 520806049}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 806911717}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &520806051
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 520806049}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_FontData:
|
||||||
|
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_FontSize: 14
|
||||||
|
m_FontStyle: 0
|
||||||
|
m_BestFit: 0
|
||||||
|
m_MinSize: 10
|
||||||
|
m_MaxSize: 40
|
||||||
|
m_Alignment: 4
|
||||||
|
m_AlignByGeometry: 0
|
||||||
|
m_RichText: 1
|
||||||
|
m_HorizontalOverflow: 0
|
||||||
|
m_VerticalOverflow: 0
|
||||||
|
m_LineSpacing: 1
|
||||||
|
m_Text: Yes
|
||||||
|
--- !u!222 &520806052
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 520806049}
|
||||||
--- !u!1 &657463235
|
--- !u!1 &657463235
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -345,6 +419,128 @@ RectTransform:
|
|||||||
m_AnchoredPosition: {x: 16, y: -19.00003}
|
m_AnchoredPosition: {x: 16, y: -19.00003}
|
||||||
m_SizeDelta: {x: 239.20001, y: 37.799988}
|
m_SizeDelta: {x: 239.20001, y: 37.799988}
|
||||||
m_Pivot: {x: 0, y: 1}
|
m_Pivot: {x: 0, y: 1}
|
||||||
|
--- !u!1 &806911716
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 806911717}
|
||||||
|
- component: {fileID: 806911720}
|
||||||
|
- component: {fileID: 806911719}
|
||||||
|
- component: {fileID: 806911718}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: ButtonRespondYes
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &806911717
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 806911716}
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 520806050}
|
||||||
|
m_Father: {fileID: 1766020814}
|
||||||
|
m_RootOrder: 2
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: -129.1, y: -116.3}
|
||||||
|
m_SizeDelta: {x: 160, y: 30}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &806911718
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 806911716}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Navigation:
|
||||||
|
m_Mode: 3
|
||||||
|
m_SelectOnUp: {fileID: 0}
|
||||||
|
m_SelectOnDown: {fileID: 0}
|
||||||
|
m_SelectOnLeft: {fileID: 0}
|
||||||
|
m_SelectOnRight: {fileID: 0}
|
||||||
|
m_Transition: 1
|
||||||
|
m_Colors:
|
||||||
|
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
|
||||||
|
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
||||||
|
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
|
||||||
|
m_ColorMultiplier: 1
|
||||||
|
m_FadeDuration: 0.1
|
||||||
|
m_SpriteState:
|
||||||
|
m_HighlightedSprite: {fileID: 0}
|
||||||
|
m_PressedSprite: {fileID: 0}
|
||||||
|
m_DisabledSprite: {fileID: 0}
|
||||||
|
m_AnimationTriggers:
|
||||||
|
m_NormalTrigger: Normal
|
||||||
|
m_HighlightedTrigger: Highlighted
|
||||||
|
m_PressedTrigger: Pressed
|
||||||
|
m_DisabledTrigger: Disabled
|
||||||
|
m_Interactable: 0
|
||||||
|
m_TargetGraphic: {fileID: 806911719}
|
||||||
|
m_OnClick:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls:
|
||||||
|
- m_Target: {fileID: 1929635629}
|
||||||
|
m_MethodName: RequestRespondYes
|
||||||
|
m_Mode: 1
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
|
||||||
|
Culture=neutral, PublicKeyToken=null
|
||||||
|
--- !u!114 &806911719
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 806911716}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_Type: 1
|
||||||
|
m_PreserveAspect: 0
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
--- !u!222 &806911720
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 806911716}
|
||||||
--- !u!1 &1032248338
|
--- !u!1 &1032248338
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -467,6 +663,80 @@ CanvasRenderer:
|
|||||||
m_PrefabParentObject: {fileID: 0}
|
m_PrefabParentObject: {fileID: 0}
|
||||||
m_PrefabInternal: {fileID: 0}
|
m_PrefabInternal: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1032248338}
|
m_GameObject: {fileID: 1032248338}
|
||||||
|
--- !u!1 &1238162986
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1238162987}
|
||||||
|
- component: {fileID: 1238162989}
|
||||||
|
- component: {fileID: 1238162988}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: JoinRequestInfo
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &1238162987
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1238162986}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1766020814}
|
||||||
|
m_RootOrder: 4
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: -0.0000085831, y: -66.9}
|
||||||
|
m_SizeDelta: {x: 323.38, y: 55.29}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &1238162988
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1238162986}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 0.88965523, b: 0, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_FontData:
|
||||||
|
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_FontSize: 14
|
||||||
|
m_FontStyle: 0
|
||||||
|
m_BestFit: 0
|
||||||
|
m_MinSize: 10
|
||||||
|
m_MaxSize: 40
|
||||||
|
m_Alignment: 1
|
||||||
|
m_AlignByGeometry: 0
|
||||||
|
m_RichText: 1
|
||||||
|
m_HorizontalOverflow: 0
|
||||||
|
m_VerticalOverflow: 0
|
||||||
|
m_LineSpacing: 1
|
||||||
|
m_Text: No requests yet
|
||||||
|
--- !u!222 &1238162989
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1238162986}
|
||||||
--- !u!1 &1470895131
|
--- !u!1 &1470895131
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -616,6 +886,9 @@ RectTransform:
|
|||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 1032248339}
|
- {fileID: 1032248339}
|
||||||
- {fileID: 657463238}
|
- {fileID: 657463238}
|
||||||
|
- {fileID: 806911717}
|
||||||
|
- {fileID: 1858885002}
|
||||||
|
- {fileID: 1238162987}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 1
|
m_RootOrder: 1
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
@ -624,6 +897,128 @@ RectTransform:
|
|||||||
m_AnchoredPosition: {x: 0, y: 0}
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
m_SizeDelta: {x: 0, y: 0}
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
m_Pivot: {x: 0, y: 0}
|
m_Pivot: {x: 0, y: 0}
|
||||||
|
--- !u!1 &1858885001
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1858885002}
|
||||||
|
- component: {fileID: 1858885005}
|
||||||
|
- component: {fileID: 1858885004}
|
||||||
|
- component: {fileID: 1858885003}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: ButtonRespondNo
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &1858885002
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1858885001}
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 1958982062}
|
||||||
|
m_Father: {fileID: 1766020814}
|
||||||
|
m_RootOrder: 3
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: 128.7, y: -116.3}
|
||||||
|
m_SizeDelta: {x: 160, y: 30}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &1858885003
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1858885001}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Navigation:
|
||||||
|
m_Mode: 3
|
||||||
|
m_SelectOnUp: {fileID: 0}
|
||||||
|
m_SelectOnDown: {fileID: 0}
|
||||||
|
m_SelectOnLeft: {fileID: 0}
|
||||||
|
m_SelectOnRight: {fileID: 0}
|
||||||
|
m_Transition: 1
|
||||||
|
m_Colors:
|
||||||
|
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
|
||||||
|
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
||||||
|
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
|
||||||
|
m_ColorMultiplier: 1
|
||||||
|
m_FadeDuration: 0.1
|
||||||
|
m_SpriteState:
|
||||||
|
m_HighlightedSprite: {fileID: 0}
|
||||||
|
m_PressedSprite: {fileID: 0}
|
||||||
|
m_DisabledSprite: {fileID: 0}
|
||||||
|
m_AnimationTriggers:
|
||||||
|
m_NormalTrigger: Normal
|
||||||
|
m_HighlightedTrigger: Highlighted
|
||||||
|
m_PressedTrigger: Pressed
|
||||||
|
m_DisabledTrigger: Disabled
|
||||||
|
m_Interactable: 0
|
||||||
|
m_TargetGraphic: {fileID: 1858885004}
|
||||||
|
m_OnClick:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls:
|
||||||
|
- m_Target: {fileID: 1929635629}
|
||||||
|
m_MethodName: RequestRespondNo
|
||||||
|
m_Mode: 1
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
|
||||||
|
Culture=neutral, PublicKeyToken=null
|
||||||
|
--- !u!114 &1858885004
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1858885001}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_Type: 1
|
||||||
|
m_PreserveAspect: 0
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
--- !u!222 &1858885005
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1858885001}
|
||||||
--- !u!1 &1929635628
|
--- !u!1 &1929635628
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -671,6 +1066,11 @@ MonoBehaviour:
|
|||||||
optionalSteamId:
|
optionalSteamId:
|
||||||
callbackCalls: 0
|
callbackCalls: 0
|
||||||
clickCounter: 0
|
clickCounter: 0
|
||||||
|
joinRequest:
|
||||||
|
userId:
|
||||||
|
username:
|
||||||
|
discriminator:
|
||||||
|
avatar:
|
||||||
onConnect:
|
onConnect:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls:
|
m_Calls:
|
||||||
@ -703,6 +1103,44 @@ MonoBehaviour:
|
|||||||
m_CallState: 2
|
m_CallState: 2
|
||||||
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
|
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
|
||||||
PublicKeyToken=null
|
PublicKeyToken=null
|
||||||
|
hasResponded:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls:
|
||||||
|
- m_Target: {fileID: 1238162988}
|
||||||
|
m_MethodName: set_text
|
||||||
|
m_Mode: 5
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument: No requests yet
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
- m_Target: {fileID: 806911718}
|
||||||
|
m_MethodName: set_interactable
|
||||||
|
m_Mode: 6
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
- m_Target: {fileID: 1858885003}
|
||||||
|
m_MethodName: set_interactable
|
||||||
|
m_Mode: 6
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
|
||||||
|
PublicKeyToken=null
|
||||||
onJoin:
|
onJoin:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
@ -715,7 +1153,40 @@ MonoBehaviour:
|
|||||||
PublicKeyToken=null
|
PublicKeyToken=null
|
||||||
onJoinRequest:
|
onJoinRequest:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls:
|
||||||
|
- m_Target: {fileID: 1238162988}
|
||||||
|
m_MethodName: set_text
|
||||||
|
m_Mode: 5
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument: Someone asked to join!
|
||||||
|
m_BoolArgument: 0
|
||||||
|
m_CallState: 2
|
||||||
|
- m_Target: {fileID: 806911718}
|
||||||
|
m_MethodName: set_interactable
|
||||||
|
m_Mode: 6
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 1
|
||||||
|
m_CallState: 2
|
||||||
|
- m_Target: {fileID: 1858885003}
|
||||||
|
m_MethodName: set_interactable
|
||||||
|
m_Mode: 6
|
||||||
|
m_Arguments:
|
||||||
|
m_ObjectArgument: {fileID: 0}
|
||||||
|
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||||
|
m_IntArgument: 0
|
||||||
|
m_FloatArgument: 0
|
||||||
|
m_StringArgument:
|
||||||
|
m_BoolArgument: 1
|
||||||
|
m_CallState: 2
|
||||||
m_TypeName: DiscordJoinRequestEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral,
|
m_TypeName: DiscordJoinRequestEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral,
|
||||||
PublicKeyToken=null
|
PublicKeyToken=null
|
||||||
--- !u!4 &1929635630
|
--- !u!4 &1929635630
|
||||||
@ -731,3 +1202,77 @@ Transform:
|
|||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 3
|
m_RootOrder: 3
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &1958982061
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1958982062}
|
||||||
|
- component: {fileID: 1958982064}
|
||||||
|
- component: {fileID: 1958982063}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: Text
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &1958982062
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1958982061}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1858885002}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &1958982063
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1958982061}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_FontData:
|
||||||
|
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_FontSize: 14
|
||||||
|
m_FontStyle: 0
|
||||||
|
m_BestFit: 0
|
||||||
|
m_MinSize: 10
|
||||||
|
m_MaxSize: 40
|
||||||
|
m_Alignment: 4
|
||||||
|
m_AlignByGeometry: 0
|
||||||
|
m_RichText: 1
|
||||||
|
m_HorizontalOverflow: 0
|
||||||
|
m_VerticalOverflow: 0
|
||||||
|
m_LineSpacing: 1
|
||||||
|
m_Text: No
|
||||||
|
--- !u!222 &1958982064
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1958982061}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
static const char* APPLICATION_ID = "345229890980937739";
|
static const char* APPLICATION_ID = "345229890980937739";
|
||||||
static int FrustrationLevel = 0;
|
static int FrustrationLevel = 0;
|
||||||
static int64_t StartTime;
|
static int64_t StartTime;
|
||||||
|
static int SendPresence = 1;
|
||||||
|
|
||||||
static int prompt(char* line, size_t size)
|
static int prompt(char* line, size_t size)
|
||||||
{
|
{
|
||||||
@ -32,27 +33,31 @@ static int prompt(char* line, size_t size)
|
|||||||
|
|
||||||
static void updateDiscordPresence()
|
static void updateDiscordPresence()
|
||||||
{
|
{
|
||||||
char buffer[256];
|
if (SendPresence) {
|
||||||
DiscordRichPresence discordPresence;
|
char buffer[256];
|
||||||
memset(&discordPresence, 0, sizeof(discordPresence));
|
DiscordRichPresence discordPresence;
|
||||||
discordPresence.state = "West of House";
|
memset(&discordPresence, 0, sizeof(discordPresence));
|
||||||
sprintf(buffer, "Frustration level: %d", FrustrationLevel);
|
discordPresence.state = "West of House";
|
||||||
discordPresence.details = buffer;
|
sprintf(buffer, "Frustration level: %d", FrustrationLevel);
|
||||||
discordPresence.startTimestamp = StartTime;
|
discordPresence.details = buffer;
|
||||||
discordPresence.endTimestamp = time(0) + 5 * 60;
|
discordPresence.startTimestamp = StartTime;
|
||||||
discordPresence.largeImageKey = "canary-large";
|
discordPresence.endTimestamp = time(0) + 5 * 60;
|
||||||
discordPresence.smallImageKey = "ptb-small";
|
discordPresence.largeImageKey = "canary-large";
|
||||||
discordPresence.partyId = "party1234";
|
discordPresence.smallImageKey = "ptb-small";
|
||||||
discordPresence.partySize = 1;
|
discordPresence.partyId = "party1234";
|
||||||
discordPresence.partyMax = 6;
|
discordPresence.partySize = 1;
|
||||||
discordPresence.matchSecret = "xyzzy";
|
discordPresence.partyMax = 6;
|
||||||
discordPresence.joinSecret = "join";
|
discordPresence.matchSecret = "xyzzy";
|
||||||
discordPresence.spectateSecret = "look";
|
discordPresence.joinSecret = "join";
|
||||||
discordPresence.instance = 0;
|
discordPresence.spectateSecret = "look";
|
||||||
Discord_UpdatePresence(&discordPresence);
|
discordPresence.instance = 0;
|
||||||
|
Discord_UpdatePresence(&discordPresence);
|
||||||
|
} else {
|
||||||
|
Discord_ClearPresence();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handleDiscordReady()
|
static void handleDiscordReady(void)
|
||||||
{
|
{
|
||||||
printf("\nDiscord: ready\n");
|
printf("\nDiscord: ready\n");
|
||||||
}
|
}
|
||||||
@ -143,6 +148,18 @@ static void gameLoop()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (line[0] == 'c') {
|
||||||
|
if (SendPresence) {
|
||||||
|
printf("Clearing presence information.\n");
|
||||||
|
SendPresence = 0;
|
||||||
|
} else {
|
||||||
|
printf("Restoring presence information.\n");
|
||||||
|
SendPresence = 1;
|
||||||
|
}
|
||||||
|
updateDiscordPresence();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (line[0] == 'y') {
|
if (line[0] == 'y') {
|
||||||
printf("Reinit Discord.\n");
|
printf("Reinit Discord.\n");
|
||||||
discordInit();
|
discordInit();
|
||||||
|
3
examples/unrealstatus/.gitignore
vendored
3
examples/unrealstatus/.gitignore
vendored
@ -73,3 +73,6 @@ Intermediate/
|
|||||||
|
|
||||||
# Cache files for the editor to use
|
# Cache files for the editor to use
|
||||||
DerivedDataCache/
|
DerivedDataCache/
|
||||||
|
|
||||||
|
# Library headers must be copied automatically by the build script (build.py unreal)
|
||||||
|
Plugins/DiscordRpc/Source/ThirdParty/DiscordRpcLibrary/Include
|
||||||
|
@ -15,9 +15,15 @@
|
|||||||
"Installed": false,
|
"Installed": false,
|
||||||
"Modules": [
|
"Modules": [
|
||||||
{
|
{
|
||||||
"Name": "discordrpc",
|
"Name": "DiscordRpc",
|
||||||
"Type": "Developer",
|
"Type": "Runtime",
|
||||||
"LoadingPhase": "Default"
|
"LoadingPhase": "PreDefault",
|
||||||
|
"WhitelistPlatforms" :
|
||||||
|
[
|
||||||
|
"Win64",
|
||||||
|
"Linux",
|
||||||
|
"Mac"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
using UnrealBuildTool;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
public class DiscordRpc : ModuleRules
|
||||||
|
{
|
||||||
|
#if WITH_FORWARDED_MODULE_RULES_CTOR
|
||||||
|
public DiscordRpc(ReadOnlyTargetRules Target) : base(Target)
|
||||||
|
#else
|
||||||
|
public DiscordRpc(TargetInfo Target)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
Definitions.Add("DISCORD_DYNAMIC_LIB=1");
|
||||||
|
|
||||||
|
PublicIncludePaths.AddRange(
|
||||||
|
new string[] {
|
||||||
|
"DiscordRpc/Public"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
PrivateIncludePaths.AddRange(
|
||||||
|
new string[] {
|
||||||
|
"DiscordRpc/Private"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
PublicDependencyModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
"Core",
|
||||||
|
"DiscordRpcLibrary"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
PrivateDependencyModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
"CoreUObject",
|
||||||
|
"Engine",
|
||||||
|
"Slate",
|
||||||
|
"SlateCore",
|
||||||
|
"Projects"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
DynamicallyLoadedModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
// ... add any modules that your module loads dynamically here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
string BaseDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, "..", "..", "Source", "ThirdParty", "DiscordRpcLibrary"));
|
||||||
|
PublicIncludePaths.Add(Path.Combine(BaseDirectory, "Include"));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "DiscordRpcPrivatePCH.h"
|
||||||
|
#include "IPluginManager.h"
|
||||||
|
#include "ModuleManager.h"
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "FDiscordRpcModule"
|
||||||
|
|
||||||
|
void FDiscordRpcModule::StartupModule()
|
||||||
|
{
|
||||||
|
#if !PLATFORM_LINUX
|
||||||
|
#if defined(DISCORD_DYNAMIC_LIB)
|
||||||
|
// Get the base directory of this plugin
|
||||||
|
FString BaseDir = IPluginManager::Get().FindPlugin("DiscordRpc")->GetBaseDir();
|
||||||
|
const FString SDKDir = FPaths::Combine(*BaseDir, TEXT("Source"), TEXT("ThirdParty"), TEXT("DiscordRpcLibrary"));
|
||||||
|
#if PLATFORM_WINDOWS
|
||||||
|
const FString LibName = TEXT("discord-rpc");
|
||||||
|
const FString LibDir = FPaths::Combine(*SDKDir, TEXT("Win64"));
|
||||||
|
if (!LoadDependency(LibDir, LibName, DiscordRpcLibraryHandle)) {
|
||||||
|
FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT(LOCTEXT_NAMESPACE, "Failed to load DiscordRpc plugin. Plug-in will not be functional."));
|
||||||
|
FreeDependency(DiscordRpcLibraryHandle);
|
||||||
|
}
|
||||||
|
#elif PLATFORM_MAC
|
||||||
|
const FString LibName = TEXT("libdiscord-rpc");
|
||||||
|
const FString LibDir = FPaths::Combine(*SDKDir, TEXT("Mac"));
|
||||||
|
if (!LoadDependency(LibDir, LibName, DiscordRpcLibraryHandle)) {
|
||||||
|
FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT(LOCTEXT_NAMESPACE, "Failed to load DiscordRpc plugin. Plug-in will not be functional."));
|
||||||
|
FreeDependency(DiscordRpcLibraryHandle);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void FDiscordRpcModule::ShutdownModule()
|
||||||
|
{
|
||||||
|
// Free the dll handle
|
||||||
|
#if !PLATFORM_LINUX
|
||||||
|
#if defined(DISCORD_DYNAMIC_LIB)
|
||||||
|
FreeDependency(DiscordRpcLibraryHandle);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FDiscordRpcModule::LoadDependency(const FString& Dir, const FString& Name, void*& Handle)
|
||||||
|
{
|
||||||
|
FString Lib = Name + TEXT(".") + FPlatformProcess::GetModuleExtension();
|
||||||
|
FString Path = Dir.IsEmpty() ? *Lib : FPaths::Combine(*Dir, *Lib);
|
||||||
|
|
||||||
|
Handle = FPlatformProcess::GetDllHandle(*Path);
|
||||||
|
|
||||||
|
if (Handle == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FDiscordRpcModule::FreeDependency(void*& Handle)
|
||||||
|
{
|
||||||
|
if (Handle != nullptr)
|
||||||
|
{
|
||||||
|
FPlatformProcess::FreeDllHandle(Handle);
|
||||||
|
Handle = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef LOCTEXT_NAMESPACE
|
||||||
|
|
||||||
|
IMPLEMENT_MODULE(FDiscordRpcModule, DiscordRpc)
|
@ -1,7 +1,5 @@
|
|||||||
|
#include "DiscordRpcPrivatePCH.h"
|
||||||
|
|
||||||
#include "DiscordRpcBlueprint.h"
|
#include "DiscordRpcBlueprint.h"
|
||||||
|
|
||||||
#include "discord-rpc.h"
|
#include "discord-rpc.h"
|
||||||
|
|
||||||
DEFINE_LOG_CATEGORY(Discord)
|
DEFINE_LOG_CATEGORY(Discord)
|
||||||
@ -68,8 +66,8 @@ static void JoinRequestHandler(const DiscordJoinRequest* request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void UDiscordRpc::Initialize(const FString& applicationId,
|
void UDiscordRpc::Initialize(const FString& applicationId,
|
||||||
bool autoRegister,
|
bool autoRegister,
|
||||||
const FString& optionalSteamId)
|
const FString& optionalSteamId)
|
||||||
{
|
{
|
||||||
self = this;
|
self = this;
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
@ -89,7 +87,7 @@ void UDiscordRpc::Initialize(const FString& applicationId,
|
|||||||
auto appId = StringCast<ANSICHAR>(*applicationId);
|
auto appId = StringCast<ANSICHAR>(*applicationId);
|
||||||
auto steamId = StringCast<ANSICHAR>(*optionalSteamId);
|
auto steamId = StringCast<ANSICHAR>(*optionalSteamId);
|
||||||
Discord_Initialize(
|
Discord_Initialize(
|
||||||
(const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get());
|
(const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDiscordRpc::Shutdown()
|
void UDiscordRpc::Shutdown()
|
||||||
@ -145,3 +143,8 @@ void UDiscordRpc::UpdatePresence()
|
|||||||
|
|
||||||
Discord_UpdatePresence(&rp);
|
Discord_UpdatePresence(&rp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UDiscordRpc::ClearPresence()
|
||||||
|
{
|
||||||
|
Discord_ClearPresence();
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
#include "Core.h"
|
||||||
|
#include "DiscordRpc.h"
|
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ModuleManager.h"
|
||||||
|
|
||||||
|
class FDiscordRpcModule : public IModuleInterface {
|
||||||
|
public:
|
||||||
|
/** IModuleInterface implementation */
|
||||||
|
virtual void StartupModule() override;
|
||||||
|
virtual void ShutdownModule() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** Handle to the test dll we will load */
|
||||||
|
void* DiscordRpcLibraryHandle;
|
||||||
|
|
||||||
|
/** StartupModule is covered with defines, these functions are the place to put breakpoints */
|
||||||
|
static bool LoadDependency(const FString& Dir, const FString& Name, void*& Handle);
|
||||||
|
static void FreeDependency(void*& Handle);
|
||||||
|
};
|
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
@ -108,6 +106,11 @@ public:
|
|||||||
Category = "Discord")
|
Category = "Discord")
|
||||||
void UpdatePresence();
|
void UpdatePresence();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable,
|
||||||
|
meta = (DisplayName = "Clear presence", Keywords = "Discord rpc"),
|
||||||
|
Category = "Discord")
|
||||||
|
void ClearPresence();
|
||||||
|
|
||||||
UPROPERTY(BlueprintReadOnly,
|
UPROPERTY(BlueprintReadOnly,
|
||||||
meta = (DisplayName = "Is Discord connected", Keywords = "Discord rpc"),
|
meta = (DisplayName = "Is Discord connected", Keywords = "Discord rpc"),
|
||||||
Category = "Discord")
|
Category = "Discord")
|
@ -0,0 +1,59 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
using UnrealBuildTool;
|
||||||
|
|
||||||
|
public class DiscordRpcLibrary : ModuleRules
|
||||||
|
{
|
||||||
|
#if WITH_FORWARDED_MODULE_RULES_CTOR
|
||||||
|
public DiscordRpcLibrary(ReadOnlyTargetRules Target) : base(Target)
|
||||||
|
#else
|
||||||
|
public DiscordRpcLibrary(TargetInfo Target)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
Type = ModuleType.External;
|
||||||
|
Definitions.Add("DISCORD_DYNAMIC_LIB=1");
|
||||||
|
|
||||||
|
string BaseDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, "..", "..", "ThirdParty", "DiscordRpcLibrary"));
|
||||||
|
|
||||||
|
if (Target.Platform == UnrealTargetPlatform.Win64)
|
||||||
|
{
|
||||||
|
string lib = Path.Combine(BaseDirectory, "Win64");
|
||||||
|
|
||||||
|
// Include headers
|
||||||
|
PublicIncludePaths.Add(Path.Combine(BaseDirectory, "Include"));
|
||||||
|
|
||||||
|
// Add the import library
|
||||||
|
PublicLibraryPaths.Add(lib);
|
||||||
|
PublicAdditionalLibraries.Add(Path.Combine(lib, "discord-rpc.lib"));
|
||||||
|
|
||||||
|
// Dynamic
|
||||||
|
RuntimeDependencies.Add(new RuntimeDependency(Path.Combine(lib, "discord-rpc.dll")));
|
||||||
|
PublicDelayLoadDLLs.Add("discord-rpc.dll");
|
||||||
|
}
|
||||||
|
else if (Target.Platform == UnrealTargetPlatform.Linux)
|
||||||
|
{
|
||||||
|
string lib = Path.Combine(BaseDirectory, "Linux", "x86_64-unknown-linux-gnu");
|
||||||
|
|
||||||
|
// Include headers
|
||||||
|
PublicIncludePaths.Add(Path.Combine(BaseDirectory, "Include"));
|
||||||
|
|
||||||
|
// Add the import library
|
||||||
|
PublicLibraryPaths.Add(lib);
|
||||||
|
PublicAdditionalLibraries.Add(Path.Combine(lib, "libdiscord-rpc.so"));
|
||||||
|
RuntimeDependencies.Add(new RuntimeDependency(Path.Combine(lib, "libdiscord-rpc.so")));
|
||||||
|
}
|
||||||
|
else if (Target.Platform == UnrealTargetPlatform.Mac)
|
||||||
|
{
|
||||||
|
string lib = Path.Combine(BaseDirectory, "Mac");
|
||||||
|
|
||||||
|
// Include headers
|
||||||
|
PublicIncludePaths.Add(Path.Combine(BaseDirectory, "Include"));
|
||||||
|
|
||||||
|
// Add the import library
|
||||||
|
PublicLibraryPaths.Add(lib);
|
||||||
|
PublicAdditionalLibraries.Add(Path.Combine(lib, "libdiscord-rpc.dylib"));
|
||||||
|
RuntimeDependencies.Add(new RuntimeDependency(Path.Combine(lib, "libdiscord-rpc.dylib")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,27 +0,0 @@
|
|||||||
// Fill out your copyright notice in the Description page of Project Settings.
|
|
||||||
|
|
||||||
using System.IO;
|
|
||||||
using UnrealBuildTool;
|
|
||||||
|
|
||||||
public class discordrpcLibrary : ModuleRules
|
|
||||||
{
|
|
||||||
public discordrpcLibrary(ReadOnlyTargetRules Target) : base(Target)
|
|
||||||
{
|
|
||||||
Type = ModuleType.External;
|
|
||||||
|
|
||||||
if (Target.Platform == UnrealTargetPlatform.Win64)
|
|
||||||
{
|
|
||||||
// Add the import library
|
|
||||||
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Include"));
|
|
||||||
PublicLibraryPaths.Add(Path.Combine(ModuleDirectory, "x64", "Release"));
|
|
||||||
PublicAdditionalLibraries.Add("discord-rpc.lib");
|
|
||||||
|
|
||||||
// Delay-load the DLL, so we can load it from the right place first
|
|
||||||
PublicDelayLoadDLLs.Add("discord-rpc.dll");
|
|
||||||
}
|
|
||||||
else if (Target.Platform == UnrealTargetPlatform.Mac)
|
|
||||||
{
|
|
||||||
PublicDelayLoadDLLs.Add(Path.Combine(ModuleDirectory, "Mac", "Release", "libdiscord-rpc.dylib"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
|
||||||
|
|
||||||
#include "discordrpc.h"
|
|
||||||
#include "Core.h"
|
|
||||||
#include "IPluginManager.h"
|
|
||||||
#include "ModuleManager.h"
|
|
||||||
|
|
||||||
#define LOCTEXT_NAMESPACE "FdiscordrpcModule"
|
|
||||||
|
|
||||||
void FdiscordrpcModule::StartupModule()
|
|
||||||
{
|
|
||||||
// This code will execute after your module is loaded into memory; the exact timing is specified
|
|
||||||
// in the .uplugin file per-module
|
|
||||||
|
|
||||||
// Get the base directory of this plugin
|
|
||||||
FString BaseDir = IPluginManager::Get().FindPlugin("discordrpc")->GetBaseDir();
|
|
||||||
|
|
||||||
// Add on the relative location of the third party dll and load it
|
|
||||||
FString LibraryPath;
|
|
||||||
#if PLATFORM_WINDOWS
|
|
||||||
LibraryPath = FPaths::Combine(
|
|
||||||
*BaseDir, TEXT("Binaries/ThirdParty/discordrpcLibrary/Win64/discord-rpc.dll"));
|
|
||||||
#elif PLATFORM_MAC
|
|
||||||
LibraryPath = FPaths::Combine(
|
|
||||||
*BaseDir, TEXT("Source/ThirdParty/discordrpcLibrary/Mac/Release/libdiscord-rpc.dylib"));
|
|
||||||
#endif // PLATFORM_WINDOWS
|
|
||||||
|
|
||||||
DiscordLibraryHandle =
|
|
||||||
!LibraryPath.IsEmpty() ? FPlatformProcess::GetDllHandle(*LibraryPath) : nullptr;
|
|
||||||
|
|
||||||
if (!DiscordLibraryHandle) {
|
|
||||||
FMessageDialog::Open(
|
|
||||||
EAppMsgType::Ok, LOCTEXT("ThirdPartyLibraryError", "Failed to load discord-rpc library"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FdiscordrpcModule::ShutdownModule()
|
|
||||||
{
|
|
||||||
// This function may be called during shutdown to clean up your module. For modules that
|
|
||||||
// support dynamic reloading,
|
|
||||||
// we call this function before unloading the module.
|
|
||||||
|
|
||||||
// Free the dll handle
|
|
||||||
FPlatformProcess::FreeDllHandle(DiscordLibraryHandle);
|
|
||||||
DiscordLibraryHandle = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef LOCTEXT_NAMESPACE
|
|
||||||
|
|
||||||
IMPLEMENT_MODULE(FdiscordrpcModule, discordrpc)
|
|
@ -1,16 +0,0 @@
|
|||||||
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "ModuleManager.h"
|
|
||||||
|
|
||||||
class FdiscordrpcModule : public IModuleInterface {
|
|
||||||
public:
|
|
||||||
/** IModuleInterface implementation */
|
|
||||||
virtual void StartupModule() override;
|
|
||||||
virtual void ShutdownModule() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/** Handle to the test dll we will load */
|
|
||||||
void* DiscordLibraryHandle;
|
|
||||||
};
|
|
@ -1,65 +0,0 @@
|
|||||||
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
|
||||||
|
|
||||||
using UnrealBuildTool;
|
|
||||||
|
|
||||||
public class discordrpc : ModuleRules
|
|
||||||
{
|
|
||||||
public discordrpc(ReadOnlyTargetRules Target) : base(Target)
|
|
||||||
{
|
|
||||||
Definitions.Add("DISCORD_DYNAMIC_LIB=1");
|
|
||||||
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
|
|
||||||
|
|
||||||
PublicIncludePaths.AddRange(
|
|
||||||
new string[] {
|
|
||||||
"discordrpc/Public"
|
|
||||||
// ... add public include paths required here ...
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
PrivateIncludePaths.AddRange(
|
|
||||||
new string[] {
|
|
||||||
"discordrpc/Private",
|
|
||||||
"../../../../../include"
|
|
||||||
// ... add other private include paths required here ...
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
PublicLibraryPaths.AddRange(
|
|
||||||
new string[] {
|
|
||||||
System.IO.Path.Combine(ModuleDirectory, "../../Binaries/ThirdParty/discordrpcLibrary/", Target.Platform.ToString()),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
PublicDependencyModuleNames.AddRange(
|
|
||||||
new string[]
|
|
||||||
{
|
|
||||||
"CoreUObject",
|
|
||||||
"Engine",
|
|
||||||
"Slate",
|
|
||||||
"SlateCore",
|
|
||||||
"Core",
|
|
||||||
"discordrpcLibrary",
|
|
||||||
"Projects"
|
|
||||||
// ... add other public dependencies that you statically link with here ...
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
PrivateDependencyModuleNames.AddRange(
|
|
||||||
new string[]
|
|
||||||
{
|
|
||||||
// ... add private dependencies that you statically link with here ...
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
DynamicallyLoadedModuleNames.AddRange(
|
|
||||||
new string[]
|
|
||||||
{
|
|
||||||
// ... add any modules that your module loads dynamically here ...
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -49,7 +49,7 @@ typedef struct DiscordJoinRequest {
|
|||||||
} DiscordJoinRequest;
|
} DiscordJoinRequest;
|
||||||
|
|
||||||
typedef struct DiscordEventHandlers {
|
typedef struct DiscordEventHandlers {
|
||||||
void (*ready)();
|
void (*ready)(void);
|
||||||
void (*disconnected)(int errorCode, const char* message);
|
void (*disconnected)(int errorCode, const char* message);
|
||||||
void (*errored)(int errorCode, const char* message);
|
void (*errored)(int errorCode, const char* message);
|
||||||
void (*joinGame)(const char* joinSecret);
|
void (*joinGame)(const char* joinSecret);
|
||||||
@ -76,6 +76,7 @@ DISCORD_EXPORT void Discord_UpdateConnection(void);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence);
|
DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence);
|
||||||
|
DISCORD_EXPORT void Discord_ClearPresence(void);
|
||||||
|
|
||||||
DISCORD_EXPORT void Discord_Respond(const char* userid, /* DISCORD_REPLY_ */ int reply);
|
DISCORD_EXPORT void Discord_Respond(const char* userid, /* DISCORD_REPLY_ */ int reply);
|
||||||
|
|
||||||
|
@ -29,16 +29,18 @@ if(WIN32)
|
|||||||
set(BASE_RPC_SRC ${BASE_RPC_SRC} connection_win.cpp discord_register_win.cpp)
|
set(BASE_RPC_SRC ${BASE_RPC_SRC} connection_win.cpp discord_register_win.cpp)
|
||||||
add_library(discord-rpc ${BASE_RPC_SRC})
|
add_library(discord-rpc ${BASE_RPC_SRC})
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
set(CRT_FLAGS)
|
|
||||||
if(USE_STATIC_CRT)
|
if(USE_STATIC_CRT)
|
||||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
foreach(CompilerFlag
|
||||||
set(CRT_FLAGS /MTd)
|
CMAKE_CXX_FLAGS
|
||||||
else()
|
CMAKE_CXX_FLAGS_DEBUG
|
||||||
set(CRT_FLAGS /MT)
|
CMAKE_CXX_FLAGS_RELEASE
|
||||||
endif()
|
CMAKE_C_FLAGS
|
||||||
|
CMAKE_C_FLAGS_DEBUG
|
||||||
|
CMAKE_C_FLAGS_RELEASE)
|
||||||
|
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
|
||||||
|
endforeach()
|
||||||
endif(USE_STATIC_CRT)
|
endif(USE_STATIC_CRT)
|
||||||
target_compile_options(discord-rpc PRIVATE /EHsc
|
target_compile_options(discord-rpc PRIVATE /EHsc
|
||||||
${CRT_FLAGS}
|
|
||||||
/Wall
|
/Wall
|
||||||
/wd4100 # unreferenced formal parameter
|
/wd4100 # unreferenced formal parameter
|
||||||
/wd4514 # unreferenced inline
|
/wd4514 # unreferenced inline
|
||||||
|
@ -304,7 +304,7 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId,
|
|||||||
IoThread.Start();
|
IoThread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" DISCORD_EXPORT void Discord_Shutdown()
|
extern "C" DISCORD_EXPORT void Discord_Shutdown(void)
|
||||||
{
|
{
|
||||||
if (!Connection) {
|
if (!Connection) {
|
||||||
return;
|
return;
|
||||||
@ -325,6 +325,11 @@ extern "C" DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence*
|
|||||||
SignalIOActivity();
|
SignalIOActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" DISCORD_EXPORT void Discord_ClearPresence(void)
|
||||||
|
{
|
||||||
|
Discord_UpdatePresence(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" DISCORD_EXPORT void Discord_Respond(const char* userId, /* DISCORD_REPLY_ */ int reply)
|
extern "C" DISCORD_EXPORT void Discord_Respond(const char* userId, /* DISCORD_REPLY_ */ int reply)
|
||||||
{
|
{
|
||||||
// if we are not connected, let's not batch up stale messages for later
|
// if we are not connected, let's not batch up stale messages for later
|
||||||
@ -340,7 +345,7 @@ extern "C" DISCORD_EXPORT void Discord_Respond(const char* userId, /* DISCORD_RE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" DISCORD_EXPORT void Discord_RunCallbacks()
|
extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void)
|
||||||
{
|
{
|
||||||
// Note on some weirdness: internally we might connect, get other signals, disconnect any number
|
// Note on some weirdness: internally we might connect, get other signals, disconnect any number
|
||||||
// of times inbetween calls here. Externally, we want the sequence to seem sane, so any other
|
// of times inbetween calls here. Externally, we want the sequence to seem sane, so any other
|
||||||
|
@ -5,45 +5,28 @@
|
|||||||
|
|
||||||
#include "discord_register.h"
|
#include "discord_register.h"
|
||||||
|
|
||||||
static bool Mkdir(const char* path)
|
|
||||||
{
|
|
||||||
int result = mkdir(path, 0755);
|
|
||||||
if (result == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (errno == EEXIST) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void RegisterCommand(const char* applicationId, const char* command)
|
static void RegisterCommand(const char* applicationId, const char* command)
|
||||||
{
|
{
|
||||||
// There does not appear to be a way to register arbitrary commands on OSX, so instead we'll save the command
|
// There does not appear to be a way to register arbitrary commands on OSX, so instead we'll save the command
|
||||||
// to a file in the Discord config path, and when it is needed, Discord can try to load the file there, open
|
// to a file in the Discord config path, and when it is needed, Discord can try to load the file there, open
|
||||||
// the command therein (will pass to js's window.open, so requires a url-like thing)
|
// the command therein (will pass to js's window.open, so requires a url-like thing)
|
||||||
|
|
||||||
const char* home = getenv("HOME");
|
// Note: will not work for sandboxed apps
|
||||||
|
NSString *home = NSHomeDirectory();
|
||||||
if (!home) {
|
if (!home) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char path[2048];
|
NSString *path = [[[[[[home stringByAppendingPathComponent:@"Library"]
|
||||||
sprintf(path, "%s/Library/Application Support/discord", home);
|
stringByAppendingPathComponent:@"Application Support"]
|
||||||
Mkdir(path);
|
stringByAppendingPathComponent:@"discord"]
|
||||||
strcat(path, "/games");
|
stringByAppendingPathComponent:@"games"]
|
||||||
Mkdir(path);
|
stringByAppendingPathComponent:[NSString stringWithUTF8String:applicationId]]
|
||||||
strcat(path, "/");
|
stringByAppendingPathExtension:@"json"];
|
||||||
strcat(path, applicationId);
|
[[NSFileManager defaultManager] createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
|
||||||
strcat(path, ".json");
|
|
||||||
|
|
||||||
FILE* f = fopen(path, "w");
|
NSString *jsonBuffer = [NSString stringWithFormat:@"{\"command\": \"%s\"}", command];
|
||||||
if (f) {
|
[jsonBuffer writeToFile:path atomically:NO encoding:NSUTF8StringEncoding error:nil];
|
||||||
char jsonBuffer[2048];
|
|
||||||
int len = snprintf(jsonBuffer, sizeof(jsonBuffer), "{\"command\": \"%s\"}", command);
|
|
||||||
fwrite(jsonBuffer, (size_t)len, 1, f);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RegisterURL(const char* applicationId)
|
static void RegisterURL(const char* applicationId)
|
||||||
@ -83,15 +66,15 @@ void Discord_Register(const char* applicationId, const char* command)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// raii lite
|
// raii lite
|
||||||
void* pool = [[NSAutoreleasePool alloc] init];
|
@autoreleasepool {
|
||||||
RegisterURL(applicationId);
|
RegisterURL(applicationId);
|
||||||
[(id)pool drain];
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Discord_RegisterSteamGame(const char* applicationId, const char* steamId)
|
void Discord_RegisterSteamGame(const char* applicationId, const char* steamId)
|
||||||
{
|
{
|
||||||
char command[256];
|
char command[256];
|
||||||
sprintf(command, "steam://rungameid/%s", steamId);
|
snprintf(command, 256, "steam://rungameid/%s", steamId);
|
||||||
Discord_Register(applicationId, command);
|
Discord_Register(applicationId, command);
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,4 @@
|
|||||||
/*
|
|
||||||
* MinGW defaults to WINNT 5.1 (aka XP), however some of functions used here
|
|
||||||
* require WINNT >= 6.0 APIs, which are only visible when WINVER and
|
|
||||||
* _WIN32_WINNT defines are set properly before including any system headers.
|
|
||||||
* Such API is e.g. RegSetKeyValueW.
|
|
||||||
*/
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
// 0x0600 == vista
|
|
||||||
#define WINVER 0x0600
|
|
||||||
#define _WIN32_WINNT 0x0600
|
|
||||||
#endif // __MINGW32__
|
|
||||||
|
|
||||||
#include "discord-rpc.h"
|
#include "discord-rpc.h"
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define NOMCX
|
#define NOMCX
|
||||||
@ -19,7 +6,51 @@
|
|||||||
#define NOIME
|
#define NOIME
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
|
#include <cwchar>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updated fixes for MinGW and WinXP
|
||||||
|
* This block is written the way it does not involve changing the rest of the code
|
||||||
|
* Checked to be compiling
|
||||||
|
* 1) strsafe.h belongs to Windows SDK and cannot be added to MinGW
|
||||||
|
* #include guarded, functions redirected to <string.h> substitutes
|
||||||
|
* 2) RegSetKeyValueW and LSTATUS are not declared in <winreg.h>
|
||||||
|
* The entire function is rewritten
|
||||||
|
*/
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
/// strsafe.h fixes
|
||||||
|
#define StringCbPrintfW snwprintf
|
||||||
|
LPWSTR StringCbCopyW(LPWSTR a, size_t l, LPCWSTR b)
|
||||||
|
{
|
||||||
|
a[l-1] = 0;
|
||||||
|
return wcsncpy(a, b, l - 1); // does not set the last byte to 0 on overflow, so it's set to 0 above
|
||||||
|
}
|
||||||
|
#else
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
|
#endif // __MINGW32__
|
||||||
|
|
||||||
|
/// winreg.h fixes
|
||||||
|
#ifndef LSTATUS
|
||||||
|
#define LSTATUS LONG
|
||||||
|
#endif
|
||||||
|
#ifdef RegSetKeyValueW
|
||||||
|
#undefine RegSetKeyValueW
|
||||||
|
#endif
|
||||||
|
#define RegSetKeyValueW regset
|
||||||
|
LSTATUS regset(HKEY hkey, LPCWSTR subkey, LPCWSTR name, DWORD type, const void *data, DWORD len)
|
||||||
|
{
|
||||||
|
HKEY hsubkey = NULL;
|
||||||
|
LSTATUS ret;
|
||||||
|
if (subkey && subkey[0]) /* need to create the subkey */
|
||||||
|
{
|
||||||
|
if ((ret = RegCreateKeyW( hkey, subkey, &hsubkey )) != ERROR_SUCCESS) return ret;
|
||||||
|
hkey = hsubkey;
|
||||||
|
}
|
||||||
|
ret = RegSetValueExW( hkey, name, 0, type, (const BYTE*)data, len );
|
||||||
|
if (hsubkey) RegCloseKey( hsubkey );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void Discord_RegisterW(const wchar_t* applicationId, const wchar_t* command)
|
void Discord_RegisterW(const wchar_t* applicationId, const wchar_t* command)
|
||||||
{
|
{
|
||||||
|
@ -102,6 +102,7 @@ size_t JsonWriteRichPresenceObj(char* dest,
|
|||||||
WriteKey(writer, "pid");
|
WriteKey(writer, "pid");
|
||||||
writer.Int(pid);
|
writer.Int(pid);
|
||||||
|
|
||||||
|
if (presence != nullptr)
|
||||||
{
|
{
|
||||||
WriteObject activity(writer, "activity");
|
WriteObject activity(writer, "activity");
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef __MINGW32__
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
|
|
||||||
#pragma warning(disable : 4061) // enum is not explicitly handled by a case label
|
#pragma warning(disable : 4061) // enum is not explicitly handled by a case label
|
||||||
@ -9,12 +10,15 @@
|
|||||||
#pragma warning(disable : 4464) // relative include path contains
|
#pragma warning(disable : 4464) // relative include path contains
|
||||||
#pragma warning(disable : 4668) // is not defined as a preprocessor macro
|
#pragma warning(disable : 4668) // is not defined as a preprocessor macro
|
||||||
#pragma warning(disable : 6313) // Incorrect operator
|
#pragma warning(disable : 6313) // Incorrect operator
|
||||||
|
#endif // __MINGW32__
|
||||||
|
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
#include "rapidjson/stringbuffer.h"
|
#include "rapidjson/stringbuffer.h"
|
||||||
#include "rapidjson/writer.h"
|
#include "rapidjson/writer.h"
|
||||||
|
|
||||||
|
#ifndef __MINGW32__
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
#endif // __MINGW32__
|
||||||
|
|
||||||
// if only there was a standard library function for this
|
// if only there was a standard library function for this
|
||||||
template <size_t Len>
|
template <size_t Len>
|
||||||
|
Reference in New Issue
Block a user