import logging
import sys
import sqlite3
class GuildDB:
def __init__(self, dbfile):
self._dbfile = dbfile
self.logger = logging.getLogger('ManaChat.Guild')
self.db, self.cur = self._open_sqlite_db(dbfile)
# self.cur.execute('PRAGMA foreign_keys = ON')
self.cur.execute('create table if not exists GUILDS(\
ID integer primary key,\
NAME text[25] not null unique,\
CREATED datetime default current_timestamp,\
MOTD text[100])')
self.cur.execute('create table if not exists PLAYERS(\
ID integer primary key,\
NAME text[25] not null unique,\
LASTSEEN date,\
GUILD_ID integer,\
ACCESS integer not null default -10,\
SHOWINFO boolean not null default 0,\
foreign key(GUILD_ID) references GUILDS(ID))')
self.db.commit()
def __del__(self):
try:
self.db.close()
except Exception:
pass
def _open_sqlite_db(self, dbfile):
"""
Open sqlite db, and return tuple (connection, cursor)
"""
try:
db = sqlite3.connect(dbfile)
cur = db.cursor()
except sqlite3.Error, e:
self.logger.error("sqlite3 error: %s", e.message)
sys.exit(1)
return db, cur
def guild_create(self, name):
self.cur.execute('insert into GUILDS(NAME) values(?)', (name,))
self.db.commit()
if self.cur.rowcount:
self.logger.info('Created guild "%s"', name)
return True
else:
self.logger.info('Error creating guild "%s"', name)
return False
def guild_delete(self, name):
self.cur.execute('select ID from GUILDS where name = ?', (name,))
row = self.cur.fetchone()
if row:
guild_id = row[0]
self.cur.execute('delete from GUILDS where name=?', (name,))
self.cur.execute('update PLAYERS set GUILD_ID = NULL, \
ACCESS = -10, where GUILD_ID = ?', (guild_id,))
self.db.commit()
self.logger.info('Deleted guild "%s"', name)
return True
else:
self.logger.error('Guild "%s" not found', name)
return False
def guild_set_motd(self, name, motd):
self.cur.execute('update GUILD set MOTD = ? where NAME = ?',
(motd, name))
self.db.commit()
if self.cur.rowcount:
self.logger.info('Guild "%s" MOTD: %s', name, motd)
return True
else:
self.logger.error('Error setting MOTD for guild: %s', name)
return False
def player_info(self, name):
query = '''select GUILDS.ID,GUILDS.NAME,ACCESS
from PLAYERS join GUILDS
on PLAYERS.GUILD_ID = GUILDS.ID
where PLAYERS.NAME = ?'''
self.cur.execute(query, (name,))
return self.cur.fetchone()
def player_get_access(self, name, guild_name=''):
query = 'select ACCESS from PLAYERS where NAME = ?'
self.cur.execute(query, (name, guild_name))
row = self.cur.fetchone()
if row:
return row[0]
else:
# self.logger.warning('player %s not found', name)
return -10
def player_set_access(self, name, access_level):
query = '''update table PLAYERS set ACCESS = ?
where name = ?'''
self.cur.execute(query, (name, access_level))
self.db.commit()
def player_join_guild(self, player, guild, access=0):
self.cur.execute('select ID from GUILDS where NAME = ?', (guild,))
guild_info = self.cur.fetchone()
if guild_info:
guild_id = guild_info[0]
else:
self.logger.error('Guild "%s" not found', guild)
return False
query = '''update or ignore PLAYERS
set GUILD_ID = ?, ACCESS = ?
where NAME = ?'''
self.cur.execute(query, (guild_id, access))
query = '''insert or ignore into
PLAYERS(NAME, GUILD_ID, ACCESS)
values(?, ?, ?)'''
self.cur.execute(query, (player, guild_id, access))
self.db.commit()
self.logger.info('Added player "%s" to guild "%s"',
player, guild)
return True
def player_set_showinfo(self, player, si=True):
query = '''update table PLAYERS set SHOWINFO = ?
where name = ?'''
self.cur.execute(query, (player, si))
self.db.commit()
def guild_remove_player(self, player_name):
query = '''update PLAYERS set GUILD_ID = NULL, ACCESS = -10
where NAME = ?'''
self.cur.execute(query, (player_name,))
self.db.commit()
def all_players_same_guild(self, player_name):
query = '''select NAME from PLAYERS
where GUILD_ID = (select GUILD_ID from PLAYERS
where NAME = ?)'''
return self.cur.fetchall(query, (player_name,))
def all_players_any_guild(self):
query = '''select NAME from PLAYERS
where ACCESS >= 0'''
return self.cur.fetchall(query)