Skip to content
This repository was archived by the owner on Apr 13, 2025. It is now read-only.

Commit ac6f2c0

Browse files
authored
Merge pull request #948 from codeoverflow-org/fix/streamelements-sample-username
Fallback to username if displayName is not available in StreamElements sample
2 parents 102b2c6 + 5951611 commit ac6f2c0

File tree

1 file changed

+41
-21
lines changed
  • samples/streamelements-events/extension

1 file changed

+41
-21
lines changed

samples/streamelements-events/extension/index.ts

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import NodeCG from "@nodecg/types";
22
import { StreamElementsReplicant, StreamElementsServiceClient } from "nodecg-io-streamelements";
3+
import { StreamElementsEvent, StreamElementsTestEvent } from "nodecg-io-streamelements/extension/StreamElementsEvent";
34
import { requireService } from "nodecg-io-core";
45

56
module.exports = function (nodecg: NodeCG.ServerAPI) {
@@ -12,38 +13,32 @@ module.exports = function (nodecg: NodeCG.ServerAPI) {
1213
nodecg.log.info("SE client has been updated, registering handlers now.");
1314

1415
client.onCheer((data) => {
15-
nodecg.log.info(
16-
`${data.data.displayName} just cheered ${data.data.amount} bit(s). Message: ${data.data.message}`,
17-
);
16+
nodecg.log.info(`${getName(data)} just cheered ${data.data.amount} bit(s). Message: ${data.data.message}`);
1817
});
1918

2019
client.onTestCheer((data) => {
2120
nodecg.log.info(
22-
`${data.event.displayName} just cheered ${data.event.amount} bit(s). Message: ${data.event.message}`,
21+
`${getName(data)} just cheered ${data.event.amount} bit(s). Message: ${data.event.message}`,
2322
);
2423
});
2524

2625
client.onFollow((data) => {
27-
nodecg.log.info(`${data.data.displayName} just followed.`);
26+
nodecg.log.info(`${getName(data)} just followed.`);
2827
});
2928

3029
client.onTestFollow((data) => {
31-
nodecg.log.info(`${data.event.displayName} just followed.`);
30+
nodecg.log.info(`${getName(data)} just followed.`);
3231
});
3332

3433
client.onSubscriber((data) => {
3534
nodecg.log.info(
36-
`${data.data.displayName} just subscribed for ${data.data.amount} months (${formatSubTier(
37-
data.data.tier,
38-
)}).`,
35+
`${getName(data)} just subscribed for ${data.data.amount} months (${formatSubTier(data.data.tier)}).`,
3936
);
4037
});
4138

4239
client.onTestSubscriber((data) => {
4340
nodecg.log.info(
44-
`${data.event.displayName} just subscribed for ${data.event.amount} months (${formatSubTier(
45-
data.event.tier,
46-
)}).`,
41+
`${getName(data)} just subscribed for ${data.event.amount} months (${formatSubTier(data.event.tier)}).`,
4742
);
4843
});
4944

@@ -57,47 +52,51 @@ module.exports = function (nodecg: NodeCG.ServerAPI) {
5752

5853
client.onGift((data) => {
5954
nodecg.log.info(
60-
`${data.data.displayName} just got a tier ${formatSubTier(data.data.tier)} subscription from ${
55+
`${getName(data)} just got a tier ${formatSubTier(data.data.tier)} subscription from ${
6156
data.data.sender ?? "anonymous"
62-
}! It's ${data.data.displayName}'s ${data.data.amount} month.`,
57+
}! It's ${data.data.displayName ?? data.data.username}'s ${data.data.amount} month.`,
6358
);
6459
});
6560

6661
client.onTestGift((data) => {
6762
nodecg.log.info(
68-
`${data.event.displayName} just got a tier ${formatSubTier(data.event.tier)} subscription from ${
63+
`${getName(data)} just got a tier ${formatSubTier(data.event.tier)} subscription from ${
6964
data.event.sender ?? "anonymous"
7065
}! It's ${data.event.displayName}'s ${data.event.amount} month.`,
7166
);
7267
});
7368

7469
client.onHost((data) => {
75-
nodecg.log.info(`${data.data.displayName} just hosted the stream for ${data.data.amount} viewer(s).`);
70+
nodecg.log.info(`${getName(data)} just hosted the stream for ${data.data.amount} viewer(s).`);
7671
});
7772

7873
client.onTestHost((data) => {
79-
nodecg.log.info(`${data.event.displayName} just hosted the stream for ${data.event.amount} viewer(s).`);
74+
nodecg.log.info(`${getName(data)} just hosted the stream for ${data.event.amount} viewer(s).`);
8075
});
8176

8277
client.onRaid((data) => {
83-
nodecg.log.info(`${data.data.displayName} just raided the stream with ${data.data.amount} viewers.`);
78+
nodecg.log.info(`${getName(data)} just raided the stream with ${data.data.amount} viewers.`);
8479
});
8580

8681
client.onTestRaid((data) => {
87-
nodecg.log.info(`${data.event.displayName} just raided the stream with ${data.event.amount} viewers.`);
82+
nodecg.log.info(`${getName(data)} just raided the stream with ${data.event.amount} viewers.`);
8883
});
8984

9085
client.onTip((data) => {
9186
if (data.data.currency) {
9287
nodecg.log.info(
93-
`${data.data.username} just donated ${data.data.amount} ${data.data.currency}. Message. ${data.data.message}`,
88+
`${getName(data)} just donated ${data.data.amount} ${data.data.currency}. Message. ${
89+
data.data.message
90+
}`,
9491
);
9592
}
9693
});
9794

9895
client.onTestTip((data) => {
9996
nodecg.log.info(
100-
`${data.event.name} just donated ${data.event.amount} ${data.event.currency}. Message. ${data.event.message}`,
97+
`${getName(data)} just donated ${data.event.amount} ${data.event.currency}. Message. ${
98+
data.event.message
99+
}`,
101100
);
102101
});
103102

@@ -111,6 +110,27 @@ module.exports = function (nodecg: NodeCG.ServerAPI) {
111110
streamElements?.onUnavailable(() => nodecg.log.info("SE client has been unset."));
112111
};
113112

113+
/**
114+
* Gets the name of the user from the event.
115+
* Defaults to use the displayName that is sent by StreamElements.
116+
* The displayName contains capitalization and special characters.
117+
* If the displayName is not available, the normal username of the relevant platform is used.
118+
* Supports real and test events.
119+
*/
120+
function getName(event: StreamElementsEvent | StreamElementsTestEvent): string {
121+
const eventData = "data" in event ? event.data : event.event;
122+
123+
if ("displayName" in eventData && typeof eventData.displayName === "string") {
124+
return eventData.displayName;
125+
} else if ("name" in eventData && typeof eventData.name === "string") {
126+
return eventData.name;
127+
} else if ("username" in eventData && typeof eventData.username === "string") {
128+
return eventData.username;
129+
} else {
130+
return "unknown";
131+
}
132+
}
133+
114134
function formatSubTier(tier: "1000" | "2000" | "3000" | "prime"): string {
115135
if (tier === "prime") return "Twitch Prime";
116136

0 commit comments

Comments
 (0)