-
Notifications
You must be signed in to change notification settings - Fork 1
/
Main.kt
88 lines (79 loc) · 3.6 KB
/
Main.kt
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
package org.fuchss.matrix.joinlink
import io.ktor.http.Url
import kotlinx.coroutines.runBlocking
import net.folivo.trixnity.client.MatrixClient
import net.folivo.trixnity.client.createDefaultTrixnityModules
import net.folivo.trixnity.client.fromStore
import net.folivo.trixnity.client.login
import net.folivo.trixnity.clientserverapi.model.authentication.IdentifierType
import net.folivo.trixnity.core.model.events.m.room.MemberEventContent
import net.folivo.trixnity.core.model.events.roomIdOrNull
import net.folivo.trixnity.core.model.events.senderOrNull
import org.fuchss.matrix.bots.MatrixBot
import org.fuchss.matrix.bots.command.ChangeUsernameCommand
import org.fuchss.matrix.bots.command.Command
import org.fuchss.matrix.bots.command.HelpCommand
import org.fuchss.matrix.bots.command.LogoutCommand
import org.fuchss.matrix.bots.command.QuitCommand
import org.fuchss.matrix.bots.helper.createMediaStore
import org.fuchss.matrix.bots.helper.createRepositoriesModule
import org.fuchss.matrix.bots.helper.handleEncryptedTextMessage
import org.fuchss.matrix.bots.helper.handleTextMessage
import org.fuchss.matrix.joinlink.events.joinLinkModule
import org.fuchss.matrix.joinlink.handler.command.LinkCommand
import org.fuchss.matrix.joinlink.handler.command.UnlinkCommand
import org.fuchss.matrix.joinlink.handler.handleJoinsToMatrixJoinLinkRooms
import java.io.File
import kotlin.random.Random
private lateinit var commands: List<Command>
/**
* The main function to start the bot.
*/
fun main() {
runBlocking {
val config = Config.load()
commands =
listOf(
HelpCommand(config, "JoinLink") {
commands
},
QuitCommand(config),
LogoutCommand(config),
ChangeUsernameCommand(),
LinkCommand(config),
UnlinkCommand(config)
)
val matrixClient = getMatrixClient(config)
val matrixBot = MatrixBot(matrixClient, config)
matrixBot.subscribeContent { event -> handleTextMessage(commands, event.roomIdOrNull, event.senderOrNull, event.content, matrixBot, config) }
matrixBot.subscribeContent { event -> handleEncryptedTextMessage(commands, event, matrixClient, matrixBot, config) }
matrixBot.subscribeContent<MemberEventContent> { event -> handleJoinsToMatrixJoinLinkRooms(event, event.content, matrixBot, config) }
val loggedOut = matrixBot.startBlocking()
if (loggedOut) {
// Cleanup database
val databaseFiles = listOf(File(config.dataDirectory + "/database.mv.db"), File(config.dataDirectory + "/database.trace.db"))
databaseFiles.filter { it.exists() }.forEach { it.delete() }
}
}
}
private suspend fun getMatrixClient(config: Config): MatrixClient {
val existingMatrixClient =
MatrixClient.fromStore(createRepositoriesModule(config), createMediaStore(config)) {
modules = createDefaultTrixnityModules() + joinLinkModule
}.getOrThrow()
if (existingMatrixClient != null) {
return existingMatrixClient
}
val matrixClient =
MatrixClient.login(
baseUrl = Url(config.baseUrl),
identifier = IdentifierType.User(config.username),
password = config.password,
repositoriesModule = createRepositoriesModule(config),
mediaStore = createMediaStore(config),
initialDeviceDisplayName = "${MatrixBot::class.java.`package`.name}-${Random.Default.nextInt()}"
) {
modules = createDefaultTrixnityModules() + joinLinkModule
}.getOrThrow()
return matrixClient
}