Skip to content
This repository was archived by the owner on Jan 9, 2023. It is now read-only.

Commit e38ee46

Browse files
committed
add framework for triggerig test events
1 parent 57d4d1b commit e38ee46

File tree

6 files changed

+203
-29
lines changed

6 files changed

+203
-29
lines changed

Source/Gui.py

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import tkinter as TK
2+
from TestEvents import TestEventTypes
23

34

45
class GuiWindow():
@@ -20,10 +21,11 @@ def __init__(self, state, master=None):
2021
self.state = state
2122
self.translations = state.translations
2223

23-
def CreateWidgets(self):
24+
def Setup(self):
2425
self._CreateRunningBar(self.master)
2526
self._CreateActivityLog(self.master)
26-
# self._CreateBottomBar(self.master) # Don't bother with for just a quit button
27+
self._CreateBottomBar(self.master)
28+
self.OnStopped()
2729

2830
def _CreateRunningBar(self, parent):
2931
runningContainer = TK.Frame(parent)
@@ -36,16 +38,16 @@ def _CreateRunningBar(self, parent):
3638
statusLabel.pack(side=TK.LEFT)
3739

3840
self.selectedProfileName = TK.StringVar()
39-
self.sortedProfileNames = sorted(list(
41+
sortedProfileNames = sorted(list(
4042
self.state.profiles.profiles.keys()))
4143
configProfileDefault = self.state.config.GetSetting("Profile Default")
42-
if configProfileDefault != "" and configProfileDefault in self.sortedProfileNames:
44+
if configProfileDefault != "" and configProfileDefault in sortedProfileNames:
4345
self.selectedProfileName.set(configProfileDefault)
4446
else:
4547
self.selectedProfileName.set(
4648
self.translations.GetTranslation("Gui SelectProfile"))
4749
self.profileList = TK.OptionMenu(
48-
runningContainer, self.selectedProfileName, *self.sortedProfileNames)
50+
runningContainer, self.selectedProfileName, *sortedProfileNames)
4951
self.profileList.pack(side=TK.LEFT)
5052

5153
self.startButton = TK.Button(runningContainer,
@@ -56,8 +58,6 @@ def _CreateRunningBar(self, parent):
5658
runningContainer, text=self.translations.GetTranslation("Gui StopButton"), command=self.state.OnStopButtonHandler)
5759
self.stopButton.pack(side=TK.LEFT)
5860

59-
self.OnStopped()
60-
6161
def _CreateActivityLog(self, parent):
6262
titleFrame = TK.LabelFrame(
6363
parent, text=self.translations.GetTranslation("Gui ActivityLogTitle"))
@@ -69,12 +69,47 @@ def _CreateActivityLog(self, parent):
6969
self.activityLogText.pack(fill=TK.BOTH, expand=True, side=TK.LEFT)
7070

7171
def _CreateBottomBar(self, parent):
72-
self.bottomBarContainer = TK.Frame(parent)
73-
self.bottomBarContainer.pack(fill=TK.X, side=TK.TOP)
74-
75-
quitButton = TK.Button(self.bottomBarContainer, text=self.translations.GetTranslation("Gui QuitButton"), fg="red",
76-
command=self.state.OnQuitButtonHandler)
77-
quitButton.pack(side=TK.LEFT)
72+
bottomBarContainer = TK.Frame(parent)
73+
bottomBarContainer.pack(fill=TK.X, side=TK.TOP)
74+
75+
self.selectedTestEventPlatform = TK.StringVar()
76+
self.selectedTestEventPlatform.trace_variable(
77+
TK.W, self.OnTestEventPlatformChanged)
78+
orderedTestEventPlatforms = list(TestEventTypes.platforms.keys())
79+
self.testEventPlatformList = TK.OptionMenu(
80+
bottomBarContainer, self.selectedTestEventPlatform, *orderedTestEventPlatforms)
81+
self.testEventPlatformList.pack(side=TK.LEFT)
82+
83+
self.selectedTestEventType = TK.StringVar()
84+
self.selectedTestEventType.trace_variable(
85+
TK.W, self.OnTestEventTypeChanged)
86+
self.orderedTestEventTypes = [""]
87+
self.testEventTypeList = TK.OptionMenu(
88+
bottomBarContainer, self.selectedTestEventType, *self.orderedTestEventTypes)
89+
self.testEventTypeList.pack(side=TK.LEFT)
90+
91+
self.testEventInputLabel = TK.Label(
92+
bottomBarContainer, text="amount:")
93+
self.testEventInputLabel.pack(side=TK.LEFT)
94+
self.testEventAmount = TK.StringVar()
95+
self.testEventInput = TK.Entry(
96+
bottomBarContainer, textvariable=self.testEventAmount, width=10)
97+
self.testEventInput.pack(side=TK.LEFT)
98+
99+
self.testEventButton = TK.Button(bottomBarContainer, text=self.translations.GetTranslation(
100+
"Gui TestEventButton"), command=self.state.OnTestEventButtonHandler)
101+
self.testEventButton.pack(side=TK.LEFT)
102+
103+
self.selectedTestEventPlatform.set(
104+
self.translations.GetTranslation("Gui SelectTestEventPlatform"))
105+
self.selectedTestEventType.set(
106+
self.translations.GetTranslation("Gui SelectTestEventType"))
107+
108+
self.testEventPlatformList.config(state=TK.DISABLED)
109+
self.testEventTypeList.config(state=TK.DISABLED)
110+
self.testEventInputLabel.config(state=TK.DISABLED)
111+
self.testEventInput.config(state=TK.DISABLED)
112+
self.testEventButton.config(state=TK.DISABLED)
78113

79114
def UpdateStatusText(self, text):
80115
self.statusText.set(text)
@@ -89,8 +124,39 @@ def OnStarted(self):
89124
self.startButton.config(state=TK.DISABLED)
90125
self.profileList.config(state=TK.DISABLED)
91126
self.stopButton.config(state=TK.NORMAL)
127+
self.testEventPlatformList.config(state=TK.NORMAL)
92128

93129
def OnStopped(self):
94130
self.startButton.config(state=TK.NORMAL)
95131
self.profileList.config(state=TK.NORMAL)
96132
self.stopButton.config(state=TK.DISABLED)
133+
self.testEventPlatformList.config(state=TK.DISABLED)
134+
135+
def OnTestEventPlatformChanged(self, *args):
136+
self.testEventTypeList["menu"].delete(0, TK.END)
137+
orderedTestEventTypes = []
138+
if self.selectedTestEventPlatform.get() != self.translations.GetTranslation("Gui SelectTestEventPlatform"):
139+
orderedTestEventTypes = list(
140+
TestEventTypes.platforms[self.selectedTestEventPlatform.get()].keys())
141+
for testEventType in orderedTestEventTypes:
142+
self.testEventTypeList["menu"].add_command(
143+
label=testEventType, command=TK._setit(self.selectedTestEventType, testEventType))
144+
self.selectedTestEventType.set(
145+
self.translations.GetTranslation("Gui SelectTestEventType"))
146+
self.testEventTypeList.config(state=TK.NORMAL)
147+
self.testEventInputLabel.config(state=TK.DISABLED)
148+
self.testEventInput.config(state=TK.DISABLED)
149+
self.testEventButton.config(state=TK.DISABLED)
150+
151+
def OnTestEventTypeChanged(self, *args):
152+
amountEnabled = False
153+
if self.selectedTestEventType.get() != self.translations.GetTranslation("Gui SelectTestEventType"):
154+
amountEnabled = TestEventTypes.platforms[self.selectedTestEventPlatform.get(
155+
)][self.selectedTestEventType.get()]["valueInput"]
156+
if amountEnabled:
157+
self.testEventInputLabel.config(state=TK.NORMAL)
158+
self.testEventInput.config(state=TK.NORMAL)
159+
else:
160+
self.testEventInputLabel.config(state=TK.DISABLED)
161+
self.testEventInput.config(state=TK.DISABLED)
162+
self.testEventButton.config(state=TK.NORMAL)

Source/Streamlabs Rcon Integration.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from Profiles import Profiles
99
from Rcon import Rcon
1010
from Translations import Translations
11+
from TestEvents import TestEvents
1112

1213

1314
class State():
@@ -25,9 +26,10 @@ def Setup(self):
2526
self.profiles = Profiles(self)
2627
self.streamlabs = Streamlabs(self)
2728
self.rcon = Rcon(self)
29+
self.testEvents = TestEvents(self)
2830
self.guiWindow = GuiWindow(self)
2931
self.gui = self.guiWindow.gui
30-
self.gui.CreateWidgets()
32+
self.gui.Setup()
3133

3234
def OnStartButtonHandler(self):
3335
try:
@@ -162,6 +164,22 @@ def OnStreamlabsEventHandler(self, data):
162164
self.logging.RecordException(
163165
ex, "OBS Event Handler Critical Error - This event won't be processed")
164166

167+
def OnTestEventButtonHandler(self):
168+
try:
169+
testEventPlatform = self.gui.selectedTestEventPlatform.get()
170+
testEventType = self.gui.selectedTestEventType.get()
171+
testEventAmount = self.gui.testEventAmount.get()
172+
testEvent = self.testEvents.GenerateTestEvent(
173+
testEventPlatform, testEventType, testEventAmount)
174+
if testEvent != None:
175+
self.OnStreamlabsEventHandler(testEvent)
176+
else:
177+
self.RecordActivity(
178+
self.translations.GetTranslation("TestEvent InvalidTestEvent") + testEventPlatform + " - " + testEventType)
179+
except Exception as ex:
180+
self.logging.RecordException(
181+
ex, "Test Event Critical Error - Failed to run test event")
182+
165183
def UpdateStatus(self):
166184
if self.streamlabs.connecting:
167185
self.gui.UpdateStatusText(

Source/TestEvents.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
class TestEvents:
2+
def __init__(self, state):
3+
self.state = state
4+
5+
def GenerateTestEvent(self, eventPlatform, eventType, amount):
6+
if eventPlatform == "Twitch":
7+
if eventType == "Subscribe":
8+
return {
9+
'type': 'subscription',
10+
'message': [
11+
{
12+
'name': 'user',
13+
'display_name': 'UsEr',
14+
'months': '4',
15+
'message': 'a test subscription',
16+
'emotes': '1:25-26',
17+
'sub_plan': '1000',
18+
'sub_plan_name': 'Channel\\sSubscription\\s(streamer)',
19+
'sub_type': 'resub',
20+
'gifter': None,
21+
'subscriber_twitch_id': '12345678',
22+
'streak_months': '2',
23+
'_id': 'f5b4860c38313d4564d277ccc521a4a0',
24+
'event_id': 'f5b4860c38313d4564d277ccc521a4a0'
25+
}
26+
],
27+
'for': 'twitch_account'
28+
}
29+
30+
31+
class TestEventTypes:
32+
platforms = {
33+
"Streamlabs": {
34+
"Donation": {
35+
"valueInput": True
36+
}
37+
},
38+
"Patreon": {
39+
"Pledge": {
40+
"valueInput": True
41+
}
42+
},
43+
"Twitch": {
44+
"Follow": {
45+
"valueInput": False
46+
},
47+
"Subscribe": {
48+
"valueInput": False
49+
},
50+
"Receive Gift Subscription": {
51+
"valueInput": False
52+
},
53+
"Give Subscription Gifts": {
54+
"valueInput": True
55+
},
56+
"Host": {
57+
"valueInput": True
58+
},
59+
"Raid": {
60+
"valueInput": True
61+
}
62+
},
63+
"Youtube": {
64+
65+
},
66+
"Mixer": {
67+
68+
}
69+
}

Source/Translations.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ def LoadLocalisedTexts(self, language):
1212
"Gui StopButton": "Stop",
1313
"Gui QuitButton": "Quit",
1414
"Gui ActivityLogTitle": "Actvity Log",
15+
"Gui TestEventButton": "Test Event",
16+
"Gui SelectTestEventPlatform": "Select Platform",
17+
"Gui SelectTestEventType": "Select Type",
1518
"Message NeedProfileBeforeStart": "Must select a profile before starting",
1619
"Message Started": "Started",
1720
"Message StreamlabsUnexpectedStop": "Error Streamlabs Stopped Unexpectedly",
@@ -30,13 +33,14 @@ def LoadLocalisedTexts(self, language):
3033
"Rcon CommandError": "ERROR: Rcon command failed, run manually: ",
3134
"Rcon CommandResponseWarning": "WARNING: Rcon got response from server: ",
3235
"Rcon TestErrorMessage": "Rcon connection test message: ",
33-
"Rcon NoCommand": "Rcon Test Mode: "
36+
"Rcon NoCommand": "Rcon Test Mode: ",
37+
"TestEvent InvalidTestEvent": "Invalid Test Event Selection: "
3438
}
3539

3640
def GetTranslation(self, key):
3741
if key in self.currentTexts.keys():
3842
return self.currentTexts[key]
3943
else:
4044
self.state.logging.Log(
41-
"missing translation in '" + self.language + "': " + key)
45+
"ERROR: Missing translation in '" + self.language + "': " + key)
4246
return "MISSING KEY"

ToDo.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ Make a profile manager GUI
33
Make so that profile startup errors are shown in a GUI and disable running until fixed.
44
Have seperate Activity and System (status, warning, errors) logs
55
Have a way to pause logs from updating and then resume
6-
Add a way to fire test events data at this to allow better testing of responses than the Streamlabs Test Widgets button.
76
Support multiple calculated values via exec. Array in exec, to numbered strings in action script.
87
Support multiple rcon commands as an array in JSON.
98
Handle paused Factorio server accepting but not reply to RCON command. It will honor the command when the server is unpaused. So different between start test connection and event handling.
109

1110

1211

12+
Add a way to fire test events data at this to allow better testing of responses than the Streamlabs Test Widgets button. Needed for these new data types.
13+
1314
At present a mysterySubGift will trigger plus each recipient will trigger the receiving subscription event. As mysterySubGift event comes first this needs to be monitored and receieved sub gift events ignored appropariately.
1415

1516

0 commit comments

Comments
 (0)