aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx/Modules/DiscordIntegrationModule.cs
blob: 3a91cf5323ada097ad5390cd9a8f52a0c881833c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
using DiscordRPC;
using Ryujinx.Common;
using Ryujinx.Configuration;
using System;
using System.Linq;

namespace Ryujinx.Modules
{
    static class DiscordIntegrationModule
    {
        private static DiscordRpcClient _discordClient;

        private const string LargeDescription = "Ryujinx is a Nintendo Switch emulator.";

        public static RichPresence DiscordPresence { get; private set; }

        public static void Initialize()
        {
            DiscordPresence = new RichPresence
            {
                Assets = new Assets
                {
                    LargeImageKey  = "ryujinx",
                    LargeImageText = LargeDescription
                },
                Details    = "Main Menu",
                State      = "Idling",
                Timestamps = new Timestamps(DateTime.UtcNow)
            };

            ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
        }

        private static void Update(object sender, ReactiveEventArgs<bool> e)
        {
            if (e.OldValue != e.NewValue)
            {
                // If the integration was active, disable it and unload everything
                if (e.OldValue)
                {
                    _discordClient?.Dispose();

                    _discordClient = null;
                }

                // If we need to activate it and the client isn't active, initialize it
                if (e.NewValue && _discordClient == null)
                {
                    _discordClient = new DiscordRpcClient("568815339807309834");

                    _discordClient.Initialize();
                    _discordClient.SetPresence(DiscordPresence);
                }
            }
        }

        public static void SwitchToPlayingState(string titleId, string titleName)
        {
            if (SupportedTitles.Contains(titleId))
            {
                DiscordPresence.Assets.LargeImageKey = titleId;
            }

            string state = titleId;

            if (state == null)
            {
                state = "Ryujinx";
            }
            else
            {
                state = state.ToUpper();
            }

            string details = "Idling";

            if (titleName != null)
            {
                details = $"Playing {titleName}";
            }

            DiscordPresence.Details               = details;
            DiscordPresence.State                 = state;
            DiscordPresence.Assets.LargeImageText = titleName;
            DiscordPresence.Assets.SmallImageKey  = "ryujinx";
            DiscordPresence.Assets.SmallImageText = LargeDescription;
            DiscordPresence.Timestamps            = new Timestamps(DateTime.UtcNow);

            _discordClient?.SetPresence(DiscordPresence);
        }

        public static void SwitchToMainMenu()
        {
            DiscordPresence.Details               = "Main Menu";
            DiscordPresence.State                 = "Idling";
            DiscordPresence.Assets.LargeImageKey  = "ryujinx";
            DiscordPresence.Assets.LargeImageText = LargeDescription;
            DiscordPresence.Assets.SmallImageKey  = null;
            DiscordPresence.Assets.SmallImageText = null;
            DiscordPresence.Timestamps            = new Timestamps(DateTime.UtcNow);

            _discordClient?.SetPresence(DiscordPresence);
        }

        public static void Exit()
        {
            _discordClient?.Dispose();
        }

        private static readonly string[] SupportedTitles =
        {
            "0100000000010000", // Super Mario Odyssey™
            "01000b900d8b0000", // Cadence of Hyrule – Crypt of the NecroDancer Featuring The Legend of Zelda
            "01000d200ac0c000", // Bud Spencer & Terence Hill - Slaps And Beans
            "01000d700be88000", // My Girlfriend is a Mermaid!?
            "01000dc007e90000", // Sparkle Unleashed
            "01000e2003fa0000", // MIGHTY GUNVOLT BURST
            "0100225000fee000", // Blaster Master Zero
            "010028d0045ce000", // Sparkle 2
            "01002b30028f6000", // Celeste
            "01002fc00c6d0000", // Witch Thief
            "010034e005c9c000", // Code of Princess EX
            "010036b0034e4000", // Super Mario Party™
            "01003d200baa2000", // Pokémon Mystery Dungeon™: Rescue Team DX
            "01004f8006a78000", // Super Meat Boy
            "010051f00ac5e000", // SEGA AGES Sonic The Hedgehog
            "010055d009f78000", // Fire Emblem™: Three Houses
            "010056e00853a000", // A Hat in Time
            "0100574009f9e000", // 嘘つき姫と盲目王子
            "01005d700e742000", // DOOM 64
            "0100628004bce000", // Nights of Azure 2: Bride of the New Moon
            "0100633007d48000", // Hollow Knight
            "010065500b218000", // メモリーズオフ -Innocent Fille-
            "010068f00aa78000", // FINAL FANTASY XV POCKET EDITION HD
            "01006bb00c6f0000", // The Legend of Zelda™: Link’s Awakening
            "01006f8002326000", // Animal Crossing™: New Horizons
            "01006a800016e000", // Super Smash Bros.™ Ultimate
            "010072800cbe8000", // PC Building Simulator
            "01007300020fa000", // ASTRAL CHAIN
            "01007330027ee000", // Ultra Street Fighter® II: The Final Challengers
            "0100749009844000", // 20XX
            "01007a4008486000", // Enchanting Mahjong Match
            "01007ef00011e000", // The Legend of Zelda™: Breath of the Wild
            "010080b00ad66000", // Undertale
            "010082400bcc6000", // Untitled Goose Game
            "01008db008c2c000", // Pokémon™ Shield
            "010094e00b52e000", // Capcom Beat 'Em Up Bundle
            "01009aa000faa000", // Sonic Mania
            "01009b90006dc000", // Super Mario Maker™ 2
            "01009cc00c97c000", // DEAD OR ALIVE Xtreme 3 Scarlet 基本無料版
            "0100ea80032ea000", // New Super Mario Bros.™ U Deluxe
            "0100a4200a284000", // LUMINES REMASTERED
            "0100a5c00d162000", // Cuphead
            "0100abf008968000", // Pokémon™ Sword
            "0100ae000aebc000", // Angels of Death
            "0100b3f000be2000", // Pokkén Tournament™ DX
            "0100bc2004ff4000", // Owlboy
            "0100cf3007578000", // Atari Flashback Classics
            "0100d5d00c6be000", // Our World Is Ended.
            "0100d6b00cd88000", // YUMENIKKI -DREAM DIARY-
            "0100d870045b6000", // Nintendo Entertainment System™ - Nintendo Switch Online
            "0100e0c00adac000", // SENRAN KAGURA Reflexions
            "0100e46006708000", // Terraria
            "0100e7200b272000", // Lanota
            "0100e9f00b882000", // null
            "0100eab00605c000", // Poly Bridge
            "0100efd00a4fa000", // Shantae and the Pirate's Curse
            "0100f6a00a684000", // ひぐらしのなく頃に奉
            "0100f9f00c696000", // Crash™ Team Racing Nitro-Fueled
            "051337133769a000", // RGB-Seizure
        };
    }
}