Save and restore bots

This commit is contained in:
Joscha 2016-05-24 22:47:18 +02:00
parent 99796b3f93
commit 2063477c58
2 changed files with 87 additions and 15 deletions

View file

@ -187,6 +187,15 @@ class Bot():
return self.room.room return self.room.room
def password(self):
"""
password() -> password
The current room's password.
"""
return self.room.password
def nick(self): def nick(self):
""" """
nick() -> nick nick() -> nick

View file

@ -1,3 +1,5 @@
import json
from . import bot from . import bot
from . import exceptions from . import exceptions
@ -6,20 +8,31 @@ class BotManager():
Keep track of multiple bots in different rooms. Keep track of multiple bots in different rooms.
""" """
def __init__(self, bot_class, default_nick="yaboli", max_bots=100): def __init__(self, bot_class, default_nick="yaboli", max_bots=100,
bots_file="bots.json", data_file="data.json"):
""" """
bot_class - class to create instances of bot_class - class to create instances of
default_nick - default nick for all bots to assume when no nick is specified default_nick - default nick for all bots to assume when no nick is specified
max_bots - maximum number of bots allowed to exist simultaneously max_bots - maximum number of bots allowed to exist simultaneously
None or 0 - no limit None or 0 - no limit
bots_file - file the bot backups are saved to
None - no bot backups
data_file - file the bot data is saved to
- None - bot data isn't saved
""" """
self.bot_class = bot_class self.bot_class = bot_class
self.max_bots = max_bots self.max_bots = max_bots
self.default_nick = default_nick self.default_nick = default_nick
self.bots = {} self.bots_file = bots_file
self.bot_id = 0 self.data_file = data_file
self._bots = {}
self._bot_id = 0
self._bot_data = {}
self._load_bots()
def create(self, room, password=None, nick=None): def create(self, room, password=None, nick=None):
""" """
@ -31,12 +44,14 @@ class BotManager():
if nick is None: if nick is None:
nick = self.default_nick nick = self.default_nick
if self.max_bots and len(self.bots) >= self.max_bots: if self.max_bots and len(self._bots) >= self.max_bots:
raise exceptions.CreateBotException("max_bots limit hit") raise exceptions.CreateBotException("max_bots limit hit")
else: else:
bot = self.bot_class(room, nick=nick, password=password, manager=self) bot = self.bot_class(room, nick=nick, password=password, manager=self)
self.bots[self.bot_id] = bot self._bots[self._bot_id] = bot
self.bot_id += 1 self._bot_id += 1
self._save_bots()
return bot return bot
@ -47,11 +62,11 @@ class BotManager():
Kill a bot and remove it from the list of bots. Kill a bot and remove it from the list of bots.
""" """
if not bot_id in self.bots: if bot_id in self._bots:
raise exceptions.BotNotFoundException("Bot not in bots list") self._bots[bot_id].stop()
self._bots.pop(bot_id)
self.bots[bot_id].stop() self._save_bots()
del self.bots[bot_id]
def get(self, bot_id): def get(self, bot_id):
""" """
@ -60,8 +75,8 @@ class BotManager():
Return bot with that id, if found. Return bot with that id, if found.
""" """
if bot_id in self.bots: if bot_id in self._bots:
return self.bots[bot_id] return self._bots[bot_id]
def get_id(self, bot): def get_id(self, bot):
""" """
@ -70,7 +85,7 @@ class BotManager():
Return the bot id, if the bot is known. Return the bot id, if the bot is known.
""" """
for bot_id, own_bot in self.bots.items(): for bot_id, own_bot in self._bots.items():
if bot == own_bot: if bot == own_bot:
return bot_id return bot_id
@ -81,5 +96,53 @@ class BotManager():
Collect all bots that are connected to the room and have that nick. Collect all bots that are connected to the room and have that nick.
""" """
return {bot_id: bot for bot_id, bot in self.bots.items() return {bot_id: bot for bot_id, bot in self._bots.items()
if bot.roomname() == room and bot.mentionable().lower() == nick.lower()} if bot.roomname() == room and bot.mentionable().lower() == nick.lower()}
def _load_bots(self):
"""
_load_bots() -> None
Load and create bots from self.bots_file.
"""
if not self.bots_file:
return
try:
with open(self.bots_file) as f:
bots = json.load(f)
except FileNotFoundError:
pass
else:
for bot_info in bots:
bot = self.create(bot_info["room"], password=bot_info["password"],
nick=bot_info["nick"])
bot.created_in = bot_info["created_in"]
bot.created_by = bot_info["created_by"]
def _save_bots(self):
"""
_save_bots() -> None
Save all current bots to self.bots_file.
"""
if not self.bots_file:
return
bots = []
for bot_id, bot in self._bots.items():
bot_info = {}
bot_info["room"] = bot.roomname()
bot_info["password"] = bot.password()
bot_info["nick"] = bot.nick()
bot_info["created_in"] = bot.created_in
bot_info["created_by"] = bot.created_by
bots.append(bot_info)
with open(self.bots_file, "w") as f:
json.dump(bots, f)