浏览代码

Refactor plugin management; fix bug

CapacitorSet 4 年之前
父节点
当前提交
e960c23d5b

+ 6 - 8
src/main/scala/org/congressodeiradicali/karlmarx/Bot.scala

@@ -41,13 +41,10 @@ class Bot(val token: String) extends TelegramBot
 
   def getLogger() = logger
 
-  var plugins: List[Plugin] = List[Plugin](new PluginManagerPlugin(localizer, this))
-
-  def getPluginManager() : PluginManagerPlugin = plugins.head.asInstanceOf[PluginManagerPlugin]
-
-  // load core plugins
-  getPluginManager().managePlugin(new BanPlugin(localizer, this))
-  getPluginManager().managePlugin(new EchoPlugin(localizer, this))
+  var plugins: Map[String, Plugin] = Map(
+    "pluginmanager" -> new PluginManagerPlugin(localizer, this),
+    "echo" -> new EchoPlugin(localizer, this)
+  )
 
   def runAgainst(handlerPair: Plugin#HandlerPair, botUser: Option[User], cmd: Command): Boolean = {
     handlerPair._1
@@ -68,7 +65,8 @@ class Bot(val token: String) extends TelegramBot
       case None => Array()
     }
     using(command) { cmd =>
-      Future.sequence(plugins
+      Future.sequence(plugins.values
+        .filter(_.enabled)
         .flatMap(_.handlers)
         .filter(pair => runAgainst(pair, botUser, cmd))
         .map(runHandler(_, message, argv))

+ 3 - 0
src/main/scala/org/congressodeiradicali/karlmarx/Plugin.scala

@@ -9,6 +9,9 @@ trait Plugin {
   type Handler = (Message, Array[String]) => Future[Option[String]]
   type HandlerPair = (CommandFilterMagnet, Handler)
 
+  // Do not set this manually, it is handled by PluginManager
+  var enabled = false
+
   val name: String
   val description: String
   val license: String

+ 2 - 2
src/main/scala/org/congressodeiradicali/karlmarx/coreplugins/EchoPlugin.scala

@@ -12,7 +12,7 @@ class EchoPlugin(localizer: Localizer, bot: Bot) extends CorePlugin with Command
 
   override val identifier: String = "echo"
 
-  override var handlers: Map[CommandFilterMagnet, Handler] = Map {
+  override var handlers: Map[CommandFilterMagnet, Handler] = Map(
     stringToCommandFilter("echo") -> { (_, argv) => Future { Some(argv.drop(1).mkString(" ")) }(ExecutionContext.global) }
-  }
+  )
 }

+ 31 - 52
src/main/scala/org/congressodeiradicali/karlmarx/coreplugins/PluginManagerPlugin.scala

@@ -2,7 +2,7 @@ package org.congressodeiradicali.karlmarx.coreplugins
 
 import com.bot4s.telegram.api.declarative.{CommandFilterMagnet, CommandImplicits}
 import com.bot4s.telegram.models.Message
-import org.congressodeiradicali.karlmarx.{Bot, Localizer, Plugin}
+import org.congressodeiradicali.karlmarx.{Bot, LocalizableString, Localizer, Plugin}
 
 import scala.concurrent.{ExecutionContext, Future}
 
@@ -13,64 +13,43 @@ class PluginManagerPlugin(localizer: Localizer, bot: Bot) extends CorePlugin wit
 
   override val identifier = "pluginmanager"
 
-  var managedPlugins: Map[String, Plugin] = Map()
-  var pluginStatus: Map[String, Boolean] = Map()
+  def enableByIdentifier(id: String): Boolean =
+    if (bot.plugins.contains(id)) {
+      bot.plugins(id).enabled = true
+      true
+    } else false
 
-  def managePlugin(plugin: Plugin) = {
-    managedPlugins += (plugin.identifier -> plugin)
-    pluginStatus += (plugin.identifier -> false)
-  }
+  def disableByIdentifier(id: String): Boolean =
+    if (bot.plugins.keySet.contains(id)) {
+      bot.plugins(id).enabled = false
+      true
+    } else false
 
-  def enableByIdentifier(id: String) : Boolean = managedPlugins.get(id).fold {
-    false
-  } { plugin =>
-    bot.plugins :+= plugin
-    pluginStatus = pluginStatus.updated(plugin.identifier, true)
-    true
-  }
-
-  def disableByIdentifier(id: String) : Boolean = managedPlugins.get(id).fold { /*checks if the plugin is managed*/
-    false
-  }  { plugin =>
-    bot.plugins = bot.plugins.filter { _.identifier != plugin.identifier }
-    pluginStatus = pluginStatus.updated(plugin.identifier, false)
-    true
-  }
-
-  override var handlers: Map[CommandFilterMagnet, Handler] = Map {
+  override var handlers: Map[CommandFilterMagnet, Handler] = Map(
     stringToCommandFilter("enable") -> { (_: Message, argv: Array[String]) =>
       val name = argv(1)
-      val response = if (enableByIdentifier(name)) {
-        "Enabled!"
-      } else {
-        "Plugin not found"
-      }
+      val response = if (enableByIdentifier(name))
+      LocalizableString.PLUGIN_ENABLED
+      else
+      LocalizableString.NO_SUCH_PLUGIN
+      println(response)
 
-      Future { Some(response) }(ExecutionContext.global)
-    }
+      Future { Some(localizer.getString(response)) }(ExecutionContext.global)
+    },
 
     stringToCommandFilter("disable") -> { (_: Message, argv: Array[String]) =>
       val name = argv(1)
-      val response = if (disableByIdentifier(name)) {
-        "Disabled!"
-      } else {
-        "Plugin not found"
-      }
-
-      Future { Some(response) }(ExecutionContext.global)
-    }
-
-    stringToCommandFilter("status") -> { (_, _) =>
-      val response = pluginStatus.map { pair =>
-        managedPlugins.get(pair._1).fold {
-          // ignore and do the rest
-          ""
-        } { plugin =>
-          s"${plugin.name}. Status: ${if (pair._2) "UP" else "DOWN"}"
-        }
-      }.mkString("\n")
-
-      Future { Some(response) }(ExecutionContext.global)
+      val response = if (disableByIdentifier(name))
+        LocalizableString.PLUGIN_DISABLED
+      else
+        LocalizableString.NO_SUCH_PLUGIN
+
+      Future { Some(localizer.getString(response)) }(ExecutionContext.global)
+    },
+    /*
+    stringToCommandFilter("plugins") -> { (_: Message, _: Array[String]) =>
+      Future { Some(bot.plugins.values.map("- " + _.name).mkString("\n")) }(ExecutionContext.global)
     }
-  }
+    */
+  )
 }