/
irc-authenticated-application-api.ts
109 lines (87 loc) · 4.59 KB
/
irc-authenticated-application-api.ts
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
/*
This file is part of botten-nappet -- a Twitch bot and streaming tool.
<https://joelpurra.com/projects/botten-nappet/>
Copyright (c) 2018 Joel Purra <https://joelpurra.com/>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {
context,
} from "@botten-nappet/backend-shared/lib/dependency-injection/context/context";
import {
scoped,
} from "@botten-nappet/backend-shared/lib/dependency-injection/scoped/scoped";
import {
within,
} from "@botten-nappet/backend-shared/lib/dependency-injection/within/within";
import Bluebird from "bluebird";
import IConnectable from "@botten-nappet/shared/src/connection/iconnectable";
import IStartableStoppable from "@botten-nappet/shared/src/startable-stoppable/istartable-stoppable";
import PinoLogger from "@botten-nappet/shared/src/util/pino-logger";
/* tslint:disable:max-line-length */
import TwitchIrcConnection from "@botten-nappet/backend-twitch/src/irc/connection/irc-connection";
import IncomingIrcCommandTopicPublisher from "@botten-nappet/server-backend/src/topic-publisher/incoming-irc-command-topic-publisher";
import IncomingIrcCommandSingleItemJsonTopicsSubscriber from "@botten-nappet/server-backend/src/topics-subscriber/incoming-irc-command-single-item-json-topics-subscriber";
import OutgoingIrcCommandSingleItemJsonTopicsSubscriber from "@botten-nappet/server-backend/src/topics-subscriber/outgoing-irc-command-single-item-json-topics-subscriber";
import TwitchPerUserIrcApi from "./per-user-irc-api";
/* tslint:enable:max-line-length */
export default class BackendTwitchIrcAuthenticatedApplicationApi implements IStartableStoppable {
private connectables: IConnectable[];
private logger: PinoLogger;
constructor(
logger: PinoLogger,
@scoped(TwitchIrcConnection)
private readonly twitchIrcConnection: TwitchIrcConnection,
// @within(IncomingIrcCommandSingleItemJsonTopicsSubscriber, "BackendAuthenticatedApplicationMain")
// private readonly twitchMessageQueueSingleItemJsonTopicsSubscriberForITwitchIncomingIrcCommand:
// IncomingIrcCommandSingleItemJsonTopicsSubscriber,
@scoped(OutgoingIrcCommandSingleItemJsonTopicsSubscriber)
private readonly twitchMessageQueueSingleItemJsonTopicsSubscriberForITwitchOutgoingIrcCommand:
OutgoingIrcCommandSingleItemJsonTopicsSubscriber,
// @scoped(IncomingIrcCommandTopicPublisher)
// private readonly messageQueueTopicPublisherForIIncomingIrcCommand:
// IncomingIrcCommandTopicPublisher,
@context(TwitchPerUserIrcApi, "TwitchPerUserIrcApi")
private readonly twitchPerUserIrcApi: TwitchPerUserIrcApi,
) {
// TODO: validate arguments.
this.logger = logger.child(this.constructor.name);
this.connectables = [];
}
public async start(): Promise<void> {
this.connectables.push(this.twitchIrcConnection);
this.connectables.push(this.twitchMessageQueueSingleItemJsonTopicsSubscriberForITwitchOutgoingIrcCommand);
// TODO: decide where the subscriber gets connected, preferably in an automated fashion.
// this.connectables.push(this.twitchMessageQueueSingleItemJsonTopicsSubscriberForITwitchIncomingIrcCommand);
await Bluebird.map(this.connectables, async (connectable) => connectable.connect());
this.logger.info("Connected.");
await this.twitchPerUserIrcApi.start();
}
public async stop(): Promise<void> {
// TODO: better cleanup handling.
// TODO: check if each of these have been started successfully.
// TODO: better null handling.
if (this.twitchPerUserIrcApi) {
await this.twitchPerUserIrcApi.stop();
}
await Bluebird.map(
this.connectables,
async (connectable) => {
try {
await connectable.disconnect();
} catch (error) {
this.logger
.error(error, connectable, "Swallowed error while disconnecting.");
}
},
);
}
}