mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-03-01 12:49:46 -06:00
115 lines
4.3 KiB
Python
115 lines
4.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
""" A base class to be derived in possible new sessions for TWBlue and services."""
|
|
from __future__ import absolute_import
|
|
from __future__ import unicode_literals
|
|
from builtins import str
|
|
from builtins import object
|
|
import os
|
|
import paths
|
|
import output
|
|
import time
|
|
import sound
|
|
import logging
|
|
import config_utils
|
|
import sqlitedict
|
|
import application
|
|
import os
|
|
from . import session_exceptions as Exceptions
|
|
log = logging.getLogger("sessionmanager.session")
|
|
|
|
|
|
class baseSession(object):
|
|
""" toDo: Decorators does not seem to be working when using them in an inherited class."""
|
|
|
|
# Decorators.
|
|
|
|
def _require_login(fn):
|
|
""" Decorator for checking if the user is logged in.
|
|
Some functions may need this to avoid making unneeded calls."""
|
|
def f(self, *args, **kwargs):
|
|
if self.logged == True:
|
|
fn(self, *args, **kwargs)
|
|
else:
|
|
raise Exceptions.NotLoggedSessionError("You are not logged in yet.")
|
|
return f
|
|
|
|
def _require_configuration(fn):
|
|
""" Check if the user has a configured session."""
|
|
def f(self, *args, **kwargs):
|
|
if self.settings != None:
|
|
fn(self, *args, **kwargs)
|
|
else:
|
|
raise Exceptions.NotConfiguredSessionError("Not configured.")
|
|
return f
|
|
|
|
def __init__(self, session_id):
|
|
""" session_id (str): The name of the folder inside the config directory where the session is located."""
|
|
super(baseSession, self).__init__()
|
|
self.session_id = session_id
|
|
self.logged = False
|
|
self.settings = None
|
|
self.db={}
|
|
|
|
@property
|
|
def is_logged(self):
|
|
return self.logged
|
|
|
|
def get_configuration(self):
|
|
""" Get settings for a session."""
|
|
file_ = "%s/session.conf" % (self.session_id,)
|
|
log.debug("Creating config file %s" % (file_,))
|
|
self.settings = config_utils.load_config(os.path.join(paths.config_path(), file_), os.path.join(paths.app_path(), "Conf.defaults"))
|
|
self.init_sound()
|
|
self.load_persistent_data()
|
|
|
|
def init_sound(self):
|
|
try: self.sound = sound.soundSystem(self.settings["sound"])
|
|
except: pass
|
|
|
|
@_require_configuration
|
|
def login(self, verify_credentials=True):
|
|
pass
|
|
|
|
@_require_configuration
|
|
def authorise(self):
|
|
pass
|
|
|
|
def save_persistent_data(self):
|
|
""" Save the data to a persistant sqlite backed file. ."""
|
|
dbname=os.path.join(paths.config_path(), str(self.session_id), "cache.db")
|
|
# persist_size set to 0 means not saving data actually.
|
|
if self.settings["general"]["persist_size"] == 0:
|
|
if os.path.exists(dbname):
|
|
os.remove(dbname)
|
|
return
|
|
try:
|
|
self.db.commit()
|
|
except:
|
|
output.speak(_("An exception occurred while saving the {app} database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the {app} developers.").format(app=application.name),True)
|
|
log.exception("Exception while saving {}".format(dbname))
|
|
os.remove(dbname)
|
|
|
|
def load_persistent_data(self):
|
|
"""Import data from a database file from user config."""
|
|
dbname=os.path.join(paths.config_path(), str(self.session_id), "cache.db")
|
|
# If persist_size is set to 0, we should remove the db file as we are no longer going to save anything.
|
|
if self.settings["general"]["persist_size"] == 0:
|
|
if os.path.exists(dbname):
|
|
os.remove(dbname)
|
|
# Let's return from here, as we are not loading anything.
|
|
return
|
|
# try to load the db file.
|
|
try:
|
|
self.db=sqlitedict.SqliteDict(os.path.join(paths.config_path(), dbname), 'c')
|
|
if self.db.get("cursors") == None:
|
|
cursors = dict(direct_messages=-1)
|
|
self.db["cursors"] = cursors
|
|
except:
|
|
output.speak(_("An exception occurred while loading the {app} database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the {app} developers.").format(app=application.name), True)
|
|
log.exception("Exception while loading {}".format(dbname))
|
|
try:
|
|
os.remove(dbname)
|
|
except:
|
|
pass
|
|
|