🔖 Set version to 81
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / main / SoneModule.kt
1 package net.pterodactylus.sone.main
2
3 import com.codahale.metrics.*
4 import com.google.common.base.*
5 import com.google.common.eventbus.*
6 import com.google.inject.*
7 import com.google.inject.matcher.*
8 import com.google.inject.name.Names.*
9 import com.google.inject.spi.*
10 import net.pterodactylus.sone.database.*
11 import net.pterodactylus.sone.database.memory.*
12 import net.pterodactylus.sone.freenet.*
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.logging.*
17 import net.pterodactylus.util.version.Version
18 import java.io.*
19 import java.util.concurrent.*
20 import java.util.concurrent.Executors.*
21 import java.util.logging.*
22 import javax.inject.*
23 import javax.inject.Singleton
24
25 open class SoneModule(private val sonePlugin: SonePlugin, private val eventBus: EventBus) : AbstractModule() {
26
27         override fun configure() {
28                 val sonePropertiesFile = File("sone.properties")
29                 val firstStart = !sonePropertiesFile.exists()
30                 var newConfig = false
31                 val configuration = try {
32                         Configuration(MapConfigurationBackend(sonePropertiesFile, false))
33                 } catch (ce: ConfigurationException) {
34                         sonePropertiesFile.delete()
35                         newConfig = true
36                         Configuration(MapConfigurationBackend(sonePropertiesFile, true))
37                 }
38                 val context = Context("Sone")
39                 val loaders = configuration.getStringValue("Developer.LoadFromFilesystem")
40                                 .getValue(null)
41                                 ?.let {
42                                         configuration.getStringValue("Developer.FilesystemPath")
43                                                         .getValue(null)
44                                                         ?.let { DebugLoaders(it) }
45                                 }
46
47                 bind(Configuration::class.java).toInstance(configuration)
48                 bind(EventBus::class.java).toInstance(eventBus)
49                 bind(Boolean::class.java).annotatedWith(named("FirstStart")).toInstance(firstStart)
50                 bind(Boolean::class.java).annotatedWith(named("NewConfig")).toInstance(newConfig)
51                 bind(Context::class.java).toInstance(context)
52                 bind(object : TypeLiteral<Optional<Context>>() {}).toInstance(Optional.of(context))
53                 bind(SonePlugin::class.java).toInstance(sonePlugin)
54                 bind(Version::class.java).toInstance(sonePlugin.version.drop(1).parseVersion())
55                 bind(PluginVersion::class.java).toInstance(PluginVersion(sonePlugin.version))
56                 bind(PluginYear::class.java).toInstance(PluginYear(sonePlugin.year))
57                 bind(PluginHomepage::class.java).toInstance(PluginHomepage(sonePlugin.homepage))
58                 bind(Database::class.java).to(MemoryDatabase::class.java).`in`(Singleton::class.java)
59                 bind(Translation::class.java).toInstance(BaseL10nTranslation(sonePlugin.l10n().base))
60                 loaders?.let { bind(Loaders::class.java).toInstance(it) }
61                 bind(MetricRegistry::class.java).`in`(Singleton::class.java)
62                 bind(WebOfTrustConnector::class.java).to(PluginWebOfTrustConnector::class.java).`in`(Singleton::class.java)
63                 bind(TickerShutdown::class.java).`in`(Singleton::class.java)
64
65                 bindListener(Matchers.any(), object : TypeListener {
66                         override fun <I> hear(typeLiteral: TypeLiteral<I>, typeEncounter: TypeEncounter<I>) {
67                                 typeEncounter.register(InjectionListener { injectee ->
68                                         logger.fine { "Injecting $injectee..." }
69                                         eventBus.register(injectee)
70                                 })
71                         }
72                 })
73         }
74
75         @Provides
76         @Singleton
77         @Named("notification")
78         fun getNotificationTicker(): ScheduledExecutorService =
79                         newSingleThreadScheduledExecutor()
80
81         private val logger: Logger = Logging.getLogger(javaClass)
82
83 }
84
85 private fun String.parseVersion(): Version = Version.parse(this)