✨ Add debug flags to Core
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / main / SoneModule.kt
1 package net.pterodactylus.sone.main
2
3 import com.google.common.base.*
4 import com.google.common.eventbus.*
5 import com.google.inject.*
6 import com.google.inject.matcher.*
7 import com.google.inject.name.Names.*
8 import com.google.inject.spi.*
9 import freenet.l10n.*
10 import net.pterodactylus.sone.core.*
11 import net.pterodactylus.sone.database.*
12 import net.pterodactylus.sone.database.memory.*
13 import net.pterodactylus.sone.freenet.wot.*
14 import net.pterodactylus.util.config.*
15 import net.pterodactylus.util.config.ConfigurationException
16 import net.pterodactylus.util.version.Version
17 import java.io.*
18
19 class SoneModule(private val sonePlugin: SonePlugin) : AbstractModule() {
20
21         override fun configure() {
22                 val sonePropertiesFile = File("sone.properties")
23                 val firstStart = !sonePropertiesFile.exists()
24                 var newConfig = false
25                 val configuration = try {
26                         Configuration(MapConfigurationBackend(sonePropertiesFile, false))
27                 } catch (ce: ConfigurationException) {
28                         sonePropertiesFile.delete()
29                         newConfig = true
30                         Configuration(MapConfigurationBackend(sonePropertiesFile, true))
31                 }
32                 val context = Context("Sone")
33                 val loaders = configuration.getStringValue("Developer.LoadFromFilesystem")
34                                 .getValue(null)
35                                 ?.let {
36                                         configuration.getStringValue("Developer.FilesystemPath")
37                                                         .getValue(null)
38                                                         ?.let { DebugLoaders(it) }
39                                 }
40                 val eventBus = EventBus()
41
42                 bind(Configuration::class.java).toInstance(configuration)
43                 bind(EventBus::class.java).toInstance(eventBus)
44                 bind(Boolean::class.java).annotatedWith(named("FirstStart")).toInstance(firstStart)
45                 bind(Boolean::class.java).annotatedWith(named("NewConfig")).toInstance(newConfig)
46                 bind(Context::class.java).toInstance(context)
47                 bind(object : TypeLiteral<Optional<Context>>() {}).toInstance(Optional.of(context))
48                 bind(SonePlugin::class.java).toInstance(sonePlugin)
49                 bind(Version::class.java).toInstance(sonePlugin.version.drop(1).parseVersion())
50                 bind(PluginVersion::class.java).toInstance(PluginVersion(sonePlugin.version))
51                 bind(PluginYear::class.java).toInstance(PluginYear(sonePlugin.year))
52                 bind(PluginHomepage::class.java).toInstance(PluginHomepage(sonePlugin.homepage))
53                 bind(Database::class.java).to(MemoryDatabase::class.java).`in`(Singleton::class.java)
54                 bind(BaseL10n::class.java).toInstance(sonePlugin.l10n().base)
55                 loaders?.let { bind(Loaders::class.java).toInstance(it) }
56
57                 bindListener(Matchers.any(), object : TypeListener {
58                         override fun <I> hear(typeLiteral: TypeLiteral<I>, typeEncounter: TypeEncounter<I>) {
59                                 typeEncounter.register(InjectionListener { injectee -> eventBus.register(injectee) })
60                         }
61                 })
62         }
63
64         @Provides
65         fun getCore(configuration: Configuration, freenetInterface: FreenetInterface, identityManager: IdentityManager, soneDownloader: SoneDownloader, imageInserter: ImageInserter, updateChecker: UpdateChecker, webOfTrustUpdater: WebOfTrustUpdater, eventBus: EventBus, database: Database) =
66                         Core(configuration, freenetInterface, identityManager, soneDownloader, imageInserter, updateChecker, webOfTrustUpdater, eventBus, database).apply {
67                                 debugInformation.showVersionInformation = configuration.getBooleanValue("Debug/ShowVersionInformation").getValue(false)
68                         }
69
70 }
71
72 private fun String.parseVersion(): Version = Version.parse(this)