import time
import net.mapserv as mapserv
import net.charserv as charserv
import net.stats as stats
import commands
import walkto
import logicmanager
import status
import plugins
import itemdb
# ~ import random
from collections import deque
from net.inventory import get_item_index, get_storage_index
from utils import extends
from actor import find_nearest_being
from chat import send_whisper as whisper
from net.onlineusers import OnlineUsers
__all__ = [ 'PLUGIN', 'init' ]
PLUGIN = {
'name': 'xcom',
'requires': ['chatbot'],
'blocks': (),
}
#FIXME This must be in a library
def preloadArray(nfile):
try:
file = open(nfile, "r")
array=[]
for x in file.readlines():
x = x.replace("\n", "")
x = x.replace("\r", "")
array.append(x)
file.close()
return array
except:
print "preloadArray: File " + nfile + " not found!"
ignored_players = preloadArray("config/ignored.txt")
disliked_players = preloadArray("config/disliked.txt")
admins = preloadArray("config/admins.txt")
friends = preloadArray("config/friends.txt")
#...until here
XCOMList = preloadArray("config/XCOM.txt")
XCOMServerStatInterested = [] #List of nicks interested in server status change
XCOMBroadcastPrefix = "##B##G "
def online_list_update(curr,prev):
for x in curr:
found = False
for y in prev:
if x==y: found = True
if found == False: #detected change
for nicks in XCOMList: #For every XCOM user...
if nicks in online_users.online_users: #That's online...
if nicks in XCOMServerStatInterested: #If XCOM player is interested
if x in XCOMList: #An XCOM user connected?
XCOMDelay() #Share its status
whisper(nicks, "##W" + x + " is now online [XCOM]")
else: #Is a regular server player
if x not in XCOMList:
XCOMDelay() #Share its status
whisper(nicks, "##W" + x + " is now online")
for x in prev:
found = False
for y in curr:
if x==y: found = True
if found == False:
for nicks in XCOMList: #For every XCOM user...
if nicks in online_users.online_users: #That's online...
if nicks in XCOMServerStatInterested: #If XCOM player is interested
if x in XCOMList: #An XCOM user connected?
XCOMDelay() #Share its status
whisper(nicks, "##L" + x + " is now offline [XCOM]")
else: #Is a regular server player
if x not in XCOMList:
XCOMDelay() #Share its status
whisper(nicks, "##L" + x + " is now offline")
online_users = OnlineUsers(online_url=' https://server.themanaworld.org/online-old.txt', update_interval=20, refresh_hook=online_list_update)
def XCOMOnlineList(nick, message, is_whisper, match):
XCOMDelay()
msg=""
for nicks in XCOMList:
if nicks in online_users.online_users:
msg = msg + nicks + " | "
XCOMDelay()
whisper(nick, msg)
def XCOMPrintStat():
pOnline=0
xOnline=0
for p in online_users.online_users:
pOnline=pOnline+1
if p in XCOMList:
xOnline=xOnline+1
return "%(xOnline)d/%(pOnline)d"%{"pOnline": pOnline, "xOnline": xOnline,}
def XCOMDelay():
time.sleep(0.1)
def XCOMBroadcast(message):
for nicks in XCOMList:
if nicks in online_users.online_users:
if nicks not in ignored_players:
XCOMDelay()
whisper(nicks, message)
def XCOMCommunicate(nick, message, is_whisper, match):
if not is_whisper:
return
if nick in ignored_players:
return #or say something
if message[0]=="!":
return
if message.startswith("*AFK*:") or message.startswith("WARNING :"): # AFK and WARNING bug workaround
return
if nick in XCOMList:
for nicks in XCOMList:
if nicks in online_users.online_users:
if nick==nicks:
pass
else:
XCOMDelay()
whisper(nicks, "##B##LXCOM[" + XCOMPrintStat() + "]##l " + nick + ": ##b" + message)
else:
whisper(nick, XCOMBroadcastPrefix + "XCOM is not enabled (Use !xcon)")
def XCOMSilentInvite(nick, message, is_whisper, match):
XCOMDelay()
if not is_whisper:
return
if nick in ignored_players:
return #or say something
if nick in admins:
XCOMList.append(match.group(1))
if match.group(1) not in ignored_players:
whisper(nick, "##W--- " + nick + " silently invited " + match.group(1) + " on XCOM ---")
else:
whisper(nick, "##W" + match.group(1) + " has been ignored by bot and cannot be added to XCOM.")
def XCOMInvite(nick, message, is_whisper, match):
XCOMDelay()
if not is_whisper:
return
if nick in ignored_players:
return #or say something
if nick in admins: # FIXME Do not add if already there!!!
XCOMList.append(match.group(1))
XCOMBroadcast("##W--- " + nick + " (Admin) invited " + match.group(1) + " on XCOM ---" + XCOMBroadcastPrefix + match.group(1) + " XCOM enabled! Use !xcoff to disable, use !xclist to see XCOM online list")
else:
if nick in ignored_players:
whisper(nick, "You cannot invite banned players.")
else:
whisper(match.group(1), "##W--- " + nick + " invited you to chat on XCOM --- Answer !xcon to join.")
XCOMDelay()
whisper(nick, "Invited " + match.group(1) + " to join XCOM. Waiting for his/her reply...")
XCOMServerInvited = []
def XCOMInviteAll(nick, message, is_whisper, match):
XCOMDelay()
if not is_whisper:
return
if nick in ignored_players:
return #or say something
if nick in admins: # FIXME Do not add if already there!!!
for invn in online_users.online_users:
if invn in XCOMList:
pass
elif invn in ignored_players:
pass
elif invn in XCOMServerInvited:
pass
else:
XCOMServerInvited.append(invn)
whisper(invn, "##W--- " + nick + " invited you to chat on XCOM --- Answer !xcon to join.")
XCOMDelay()
def XCOMEnable(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in ignored_players:
return #or say something
#search array
if nick in XCOMList:
whisper(nick, XCOMBroadcastPrefix + nick + " XCOM already enabled")
else:
XCOMList.append(nick)
XCOMBroadcast("##W--- " + nick + " is online on XCOM ---" + XCOMBroadcastPrefix + nick + " XCOM enabled! Use !xcoff or !xcom off to disable, use !xclist to see XCOM online list")
def XCOMDisable(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in ignored_players:
return #or say something
#search array
if nick in XCOMList:
XCOMBroadcast("##L--- " + nick + " disabled XCOM ---")
XCOMList.remove(nick)
else:
whisper(nick, XCOMBroadcastPrefix + nick + " XCOM already disabled")
def XCOMServerInterestEnable(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in ignored_players:
return #or say something
#search array
if nick in XCOMList:
whisper(nick, XCOMBroadcastPrefix + "Server online status notifications enabled!")
XCOMServerStatInterested.append(nick)
def XCOMServerInterestDisable(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in ignored_players:
return #or say something
#search array
if nick in XCOMList:
whisper(nick, XCOMBroadcastPrefix + "Server online status notifications disabled!")
XCOMServerStatInterested.remove(nick)
def XCOMBan(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in admins:
#search array
if match.group(1) in ignored_players:
whisper(nick, "Already banned.")
else:
ignored_players.append(match.group(1))
XCOMList.remove(match.group(1))
#FIXME array need to be saved!!!
XCOMBroadcast(XCOMBroadcastPrefix + match.group(1) + " is now banned from XCOM")
else:
whisper(nick, "Admins only.")
def XCOMUnBan(nick, message, is_whisper, match):
XCOMDelay()
#accept only whispers
if not is_whisper:
return
if nick in admins:
#search array
if match.group(1) in ignored_players:
XCOMList.append(match.group(1))
ignored_players.remove(match.group(1))
#FIXME array need to be saved!!!
XCOMBroadcast(XCOMBroadcastPrefix + match.group(1) + " is now unbanned from XCOM")
whisper(match.group(1), "You are now unbanned from XCOM. Don't make it happen again.")
else:
whisper(nick, "Already banned.")
else:
whisper(nick, "Admins only.")
# =============================================
def cmd_commands(nick, message, is_whisper, match):
if not is_whisper:
return
if nick in ignored_players:
return
c = []
for cmd in xcom_commands:
if cmd.startswith('!('):
br = cmd.index(')')
c.extend(cmd[2:br].split('|'))
elif cmd.startswith('!'):
c.append(cmd[1:].split()[0])
c.sort()
whisper(nick, ', '.join(c))
xcom_commands = {
'!xcomhelp' : cmd_commands,
'!xcon' : XCOMEnable,
'!xcom' : XCOMEnable,
'!xcoff' : XCOMDisable,
'!xcom off' : XCOMDisable,
'!xclist' : XCOMOnlineList,
'!xci (.*)' : XCOMInvite,
'!xcia' : XCOMInviteAll,
'!xcsi (.*)' : XCOMSilentInvite,
'!xcb (.*)' : XCOMBan,
'!xcu (.*)' : XCOMUnBan,
'!xcsion' : XCOMServerInterestEnable,
'!xcsioff' : XCOMServerInterestDisable,
r'(.*)' : XCOMCommunicate,
}
# ~ def chatbot_answer_mod(func):
# ~ '''modifies chatbot.answer to remember last 10 commands'''
# ~ def mb_answer(nick, message, is_whisper):
# ~ return func(nick, message, is_whisper)
# ~ return mb_answer
def init(config):
for cmd, action in xcom_commands.items():
plugins.chatbot.add_command(cmd, action)
online_users.start()
# ~ plugins.chatbot.answer = chatbot_answer_mod(plugins.chatbot.answer)