Эх сурвалжийг харах

Add deflate command and require_admin decorator

Kirk Trombley 4 жил өмнө
parent
commit
69293bfefe

+ 1 - 1
lib/rollbot/plugins/decorators/__init__.py

@@ -1,3 +1,3 @@
 from .as_plugin import as_plugin
 from .attachers import with_help, with_startup, with_shutdown
-from .requires import require_min_args, require_args
+from .requires import require_min_args, require_args, require_admin

+ 12 - 0
lib/rollbot/plugins/decorators/requires.py

@@ -30,3 +30,15 @@ def require_args(n, alert_response=None):
         setattr(cls, "on_command", wrapper)
         return cls
     return decorator
+
+
+def require_admin(cls):
+    old_on_command = cls.on_command
+    @wraps(old_on_command)
+    def wrapper(self, db, message):
+        if not message.from_admin:
+            return RollbotResponse(message, failure=RollbotFailure.PERMISSIONS)
+        return old_on_command(self, db, message)
+    setattr(cls, "on_command", wrapper)
+    return cls
+

+ 16 - 1
src/plugins/rollcoin.py

@@ -5,7 +5,7 @@ import pickle
 from sudoku_py import SudokuGenerator, Sudoku
 
 from rollbot import as_plugin, with_help, as_sender_singleton, as_group_singleton, RollbotFailure
-from rollbot.plugins.decorators import with_startup, require_min_args, require_args
+from rollbot.plugins.decorators import with_startup, require_min_args, require_args, require_admin
 from rollbot.plugins.injection import Database, Config, Arg, Singleton, Message, Lazy, Query
 
 @as_sender_singleton
@@ -339,3 +339,18 @@ def blockchain(db: Database, wallets: Config("rollcoin.wallets")):
         results.append((total, name, status))
     return "\n".join(r for _, _, r in sorted(results, reverse=True))
 
+
+@with_help("Deflate the entire economy")
+@require_args(1, "Deflating requires exactly one argument: power of 10 to deflate by")
+@require_admin
+@as_plugin
+def deflate(factor: Arg(0, int, "Deflation factor must be an integer - not {}"), 
+            wallets: Query(RollcoinWallet), 
+            holdings: Query(RollcoinGamblingWallet)):
+    assert_positive(factor)
+    actual_factor = 10 ** -factor
+    for w in wallets:
+        w.balance = w.balance * actual_factor
+    for w in holdings:
+        w.balance = w.balance * actual_factor
+    return f"Done! I have deflated the entire economy by a factor of 10^{factor}"