from chat import send_whisper
from utils import extends
from commands import parse_player_name
online_users = None
db = None
max_msg_len = 200
pending_invitations = {}
def ignore():
pass
def listonline(nick, _):
curr_msg = ''
online = online_users.online_users
for prow in db.all_players_same_guild(nick):
p = prow[0]
if p in online:
if len(curr_msg + ', ' + p) > max_msg_len:
send_whisper(nick, curr_msg)
curr_msg = p
else:
curr_msg = curr_msg + ', ' + p
send_whisper(nick, curr_msg)
def leave(nick, _):
info = db.player_info(nick)
broadcast(nick, '"{}" left the guild'.format(nick), True)
db.guild_remove_player(nick)
send_whisper(nick, 'You left guild {}'.format(info[1]))
def showinfo(nick, _):
db.player_set_showinfo(nick, True)
send_whisper(nick, "Information messages are visible")
def hideinfo(nick, _):
db.player_set_showinfo(nick, False)
send_whisper(nick, "Information messages are hidden")
def status(nick, _):
_, guild, access = db.player_info(nick)
send_whisper(nick, 'Player:{}, Guild:{}, Access:{}'.format(
nick, guild, access))
# FIXME: not finished
def invite(nick, player):
if not player:
send_whisper(nick, "Usage: !invite Player")
return
pinfo = db.player_info(player)
if pinfo and pinfo[0]:
send_whisper(nick, '"{}" is already a member of guild "{}"'.format(
player, pinfo[1]))
return
online = online_users.online_users
if player not in online:
send_whisper(nick, '"{}" is not online'.format(player))
return
_, guild, _ = db.player_info(nick)
invite_msg = ('You have been invited to the "{}" guild chat. '
'If you would like to accept this invitation '
'please reply "yes" and if not then "no"').format(guild)
send_whisper(player, invite_msg)
# FIXME: what if player is offline? online_list can be outdated
pending_invitations[player] = guild
def remove(nick, player):
if not player:
send_whisper(nick, "Usage: !remove Player")
return
pinfo = db.player_info(player)
if not pinfo:
send_whisper(nick, '{} is not in any guild'.format(player))
return
gid, _, _ = db.player_info(nick)
if gid != pinfo[0]:
send_whisper(nick, '{} is not in your guild'.format(player))
return
broadcast(player, '{} was removed from your guild'.format(player), True)
db.guild_remove_player(player)
send_whisper(nick, 'You were removed from "{}" guild'.format(pinfo[1]))
def setmotd(nick, motd):
guild = db.player_info(nick)[1]
db.setmotd(guild, motd)
broadcast(nick, 'MOTD: ' + motd)
def removemotd(nick, _):
guild = db.player_info(nick)[1]
db.setmotd(guild, '')
broadcast(nick, 'MOTD removed')
def setaccess(nick, params):
try:
si = params.index(" ")
lvl = int(params[:si])
player = params[si + 1:]
if len(player) < 4:
raise ValueError
except ValueError:
send_whisper(nick, "Usage: !setaccess Level Player")
return
gid, guild_name, access = db.player_info(nick)
gidp, _, accessp = db.player_info(player)
if gid != gidp:
send_whisper(nick, '{} is not in your guild "{}"'.format(
player, guild_name))
return
if access <= accessp:
send_whisper(nick, "You cannot set access level for {}".format(
player))
return
db.player_set_access(player, lvl)
send_whisper(nick, "Player: {}, access level: {}".format(
player, lvl))
def disband(nick, _):
_, guild, _ = db.player_info(nick)
if db.guild_delete(guild):
send_whisper(nick, 'Deleted guild "{}"'.format(guild))
else:
send_whisper(nick, 'Error deleting guild "{}"'.format(guild))
def addguild(nick, params):
usage = 'Usage: !addguild Leader Guild (note: Leader can be quoted)'
if not params:
send_whisper(nick, usage)
return
leader, guild = parse_player_name(params)
if len(leader) < 4 or len(guild) < 4:
send_whisper(nick, usage)
return
if db.guild_create(guild):
send_whisper(nick, 'Created guild "{}", leader is "{}"'.format(
guild, leader))
else:
send_whisper(nick, "Error creating guild")
def removeguild(nick, guild_name):
if not guild_name:
send_whisper(nick, "Usage: !removeguild Guild")
return
if db.guild_delete(guild_name):
send_whisper(nick, 'Deleted guild "{}"'.format(guild_name))
else:
send_whisper(nick, 'Guild not found: "{}"'.format(guild_name))
def globalmsg(nick, msg):
if not msg:
send_whisper(nick, "Usage: !global Message")
return
online = online_users.online_users
for prow in db.all_players_any_guild():
pname = prow[0]
if pname in online:
send_whisper(pname, msg)
def joinguild(nick, guild):
if not guild:
send_whisper(nick, "Usage: !joinguild Guild")
return
if db.player_join_guild(nick, guild, 20):
send_whisper(nick, 'You joined guild "{}"'.format(guild))
else:
send_whisper(nick, 'Guild "{}" does not exist'.format(guild))
def showhelp(nick, _):
access = db.player_get_access(nick)
curr_line = ''
for cmd, (lvl, _, hlp) in commands.iteritems():
if access < lvl:
continue
if hlp[0] == '+':
help_s = '!' + cmd + ' ' + hlp[1:]
else:
help_s = '!' + cmd + ' -- ' + hlp
if len(curr_line + '; ' + help_s) > max_msg_len:
send_whisper(nick, curr_line)
curr_line = help_s
else:
curr_line = curr_line + '; ' + help_s
if curr_line:
send_whisper(nick, curr_line)
commands = {
"help": (-10, showhelp, "show help"),
"info": (0, status, "display guild information"),
"listonline": (0, listonline, "list online players"),
"leave": (0, leave, "leave your guild"),
"showinfo": (0, showinfo, "verbose notifications"),
"hideinfo": (0, hideinfo, "quiet notifications"),
"invite": (5, invite, "+Player -- invite player to guild"),
"remove": (5, remove, "+Player -- remove player from guild"),
"setmotd": (5, setmotd, "+MOTD -- set MOTD"),
"removemotd": (5, removemotd, "remove MOTD"),
"setaccess": (10, setaccess, "+Level Player -- set access level"),
"disband": (10, disband, "disband your guild"),
"addguild": (20, addguild, "+Leader GuildName -- add guild"),
"removeguild": (20, removeguild, "+GuildName -- remove guild"),
"global": (20, globalmsg, "+Message -- global message"),
"joinguild": (20, joinguild, "+GuildName -- join a guild"),
}
def exec_command(nick, cmdline):
end = cmdline.find(" ")
if end < 0:
cmd = cmdline[1:]
arg = ""
else:
cmd = cmdline[1:end]
arg = cmdline[end + 1:]
if cmd in commands:
lvl, func, _ = commands[cmd]
access = db.player_get_access(nick)
if access < lvl:
send_whisper(nick, 'That command is fobidden for you!')
else:
func(nick, arg)
else:
send_whisper(nick, 'Command !{} not found. Try !help'.format(cmd))
def player_joining(player, guild):
db.player_join_guild(player, guild)
broadcast(player, '{} joined your guild'.format(player), True)
def broadcast(nick, msg, exclude_nick=False):
"""
Broadcast message for all players that belong the same guild as nick.
"""
n = 0
for prec in db.all_players_same_guild(nick):
if exclude_nick and prec[0] == nick:
continue
n += 1
send_whisper(prec[0], '{} : {}'.format(nick, msg))
if n == 0:
send_whisper(nick, "You don't belong to any guild")
def online_list_update(curr, prev):
for p in curr - prev:
ginfo = db.player_info(p)
if ginfo is not None:
if ginfo[0] is not None:
allp = set(db.all_players_same_guild(p))
n = len(allp.intersection(curr))
send_whisper(p,
'Welcome to {}! ({} Members are online)'.format(
ginfo[1], n))
broadcast(p, '{} is now Online'.format(p), True)
for p in prev - curr:
broadcast(p, '{} is now Offline'.format(p), True)
@extends('smsg_whisper')
def got_whisper(data):
nick, message = data.nick, data.message
if len(message) < 1:
return
if message[0] == '!':
exec_command(nick, message)
else:
if nick in pending_invitations:
# TODO: inform message
if message.lower() == 'yes':
player_joining(nick, pending_invitations[nick])
del pending_invitations[nick]
else:
broadcast(nick, message)
@extends('smsg_whisper_response')
def send_whisper_result(data):
pass