🙈 Ignore sone.properties file
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / main / SoneModuleCreator.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 net.pterodactylus.sone.database.*
10 import net.pterodactylus.sone.database.memory.*
11 import net.pterodactylus.sone.freenet.wot.*
12 import net.pterodactylus.util.config.*
13 import net.pterodactylus.util.config.ConfigurationException
14 import net.pterodactylus.util.version.Version
15 import java.io.*
16
17 class SoneModuleCreator {
18
19         fun createModule(sonePlugin: SonePlugin) = object : AbstractModule() {
20                 override fun configure() {
21                         val sonePropertiesFile = File("sone.properties")
22                         val firstStart = !sonePropertiesFile.exists()
23                         var newConfig = false
24                         val configuration = try {
25                                 Configuration(MapConfigurationBackend(sonePropertiesFile, false))
26                         } catch (ce: ConfigurationException) {
27                                 sonePropertiesFile.delete()
28                                 newConfig = true
29                                 Configuration(MapConfigurationBackend(sonePropertiesFile, true))
30                         }
31                         val context = Context("Sone")
32                         val loaders = configuration.getStringValue("Developer.LoadFromFilesystem")
33                                         .getValue(null)
34                                         ?.let {
35                                                 configuration.getStringValue("Developer.FilesystemPath")
36                                                                 .getValue(null)
37                                                                 ?.let { DebugLoaders(it) }
38                                         }
39                         val eventBus = EventBus()
40
41                         bind(Configuration::class.java).toInstance(configuration)
42                         bind(EventBus::class.java).toInstance(eventBus)
43                         bind(Boolean::class.java).annotatedWith(named("FirstStart")).toInstance(firstStart)
44                         bind(Boolean::class.java).annotatedWith(named("NewConfig")).toInstance(newConfig)
45                         bind(Context::class.java).toInstance(context)
46                         bind(object : TypeLiteral<Optional<Context>>() {}).toInstance(Optional.of(context))
47                         bind(SonePlugin::class.java).toInstance(sonePlugin)
48                         bind(Version::class.java).toInstance(sonePlugin.version.parseVersion())
49                         bind(PluginVersion::class.java).toInstance(PluginVersion(sonePlugin.version))
50                         bind(PluginYear::class.java).toInstance(PluginYear(sonePlugin.year))
51                         bind(PluginHomepage::class.java).toInstance(PluginHomepage(sonePlugin.homepage))
52                         bind(Database::class.java).to(MemoryDatabase::class.java).`in`(Singleton::class.java)
53                         loaders?.let { bind(Loaders::class.java).toInstance(it) }
54
55                         bindListener(Matchers.any(), object : TypeListener {
56                                 override fun <I> hear(typeLiteral: TypeLiteral<I>, typeEncounter: TypeEncounter<I>) {
57                                         typeEncounter.register(InjectionListener { injectee -> eventBus.register(injectee) })
58                                 }
59                         })
60                 }
61         }
62
63 }
64
65 private fun String.parseVersion(): Version = Version.parse(this)