492 lines
14 KiB
Python
Executable File
492 lines
14 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import division
|
|
try:
|
|
import couchbase
|
|
from couchbase.bucket import Bucket
|
|
from couchbase.views.iterator import View
|
|
except:
|
|
import couchbase_ffi
|
|
from couchbase_ffi.bucket import Bucket
|
|
from couchbase_ffi.views.iterator import View
|
|
import random
|
|
import string
|
|
import web
|
|
import json
|
|
import xml.etree.ElementTree
|
|
from all_tags import tagsDict
|
|
import re
|
|
import os
|
|
import sys
|
|
from generate import gen
|
|
from subprocess import Popen, PIPE
|
|
|
|
ERR_0 = 0
|
|
ERR_1 = 1
|
|
ERR_2 = 2
|
|
ERR_3 = 3
|
|
|
|
web.config.debug = False
|
|
|
|
urls = ('/', 'home',
|
|
'/signup', 'signup',
|
|
'/signin', 'signin',
|
|
'/mod/create', 'mod_create',
|
|
'/mod', 'mod',
|
|
'/deck', 'deck',
|
|
'/faq', 'faq',
|
|
'/rss', 'rss',
|
|
'/ladder', 'ladder'
|
|
)
|
|
render = web.template.render('templates/')
|
|
|
|
app = web.application(urls, globals())
|
|
|
|
store = web.session.DiskStore('sessions')
|
|
session = web.session.Session(app, store, initializer={'login': 0})
|
|
|
|
cb = Bucket('couchbase://localhost/hbs', password='aci')
|
|
|
|
chlog = ['gameclient', 'lobbyserver', 'gameserver', 'database', 'web']
|
|
|
|
############
|
|
|
|
def rand(num):
|
|
return ''.join([random.choice(string.ascii_letters + string.digits) for n in xrange(num)])
|
|
|
|
class faq:
|
|
def GET(self):
|
|
return render.base(session, render.faq(), [], [])
|
|
|
|
class ladder:
|
|
def GET(self):
|
|
players = []
|
|
for result in View(cb, "dev_result", "result"):
|
|
w = int(result.value["w"])
|
|
l = int(result.value["l"])
|
|
n = result.value["nick"]
|
|
players.append([n, w, l, int(round(w / (w + l), 2) * 100)])
|
|
players = sorted(players, key=lambda x: x[3], reverse=True)
|
|
|
|
return render.base(session, render.ladder(players), [], [])
|
|
|
|
class rss:
|
|
def GET(self):
|
|
p = Popen("ls -la /proc/`ps aux| grep \"hm_gameserver\" | grep -v \"grep\" | awk '{print $2}'`/fd | wc -l", shell=True, stdout=PIPE)
|
|
out, err = p.communicate()
|
|
|
|
p = Popen("ls -la /proc/`ps aux| grep \"hm_lobbyserver\" | grep -v \"grep\" | awk '{print $2}'`/fd | wc -l", shell=True, stdout=PIPE)
|
|
out1, err1 = p.communicate()
|
|
|
|
return "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\
|
|
<rss version=\"2.0\">\
|
|
<channel>\
|
|
<title>hearthmod</title>\
|
|
<item>\
|
|
<title>[g:%s] [l:%s]</title>\
|
|
</item>\
|
|
</channel>\
|
|
</rss>" % (out.rstrip('\n'), out1.rstrip('\n'))
|
|
|
|
|
|
class home:
|
|
def GET(self):
|
|
return render.base(session, render.home(), [], [])
|
|
|
|
class mod:
|
|
def __init__(self):
|
|
print 'mod init'
|
|
|
|
def POST(self):
|
|
print web.data()
|
|
'''
|
|
j = json.loads(web.data())
|
|
|
|
if(j == None):
|
|
return -1
|
|
|
|
print j
|
|
if(len(j) == 1):
|
|
if 'modified' in j:
|
|
return self.modifiedCardTags(j['modified'])
|
|
elif 'card' in j:
|
|
return self.cardTags(j['card'], self.e)
|
|
elif 'remove' in j:
|
|
return self.enabledCardRemove(j['remove'])
|
|
elif 'publish' in j:
|
|
return self.modPublish(j['publish'])
|
|
|
|
else:
|
|
return self.storeLoaded(j)
|
|
'''
|
|
|
|
def GET(self):
|
|
if(session.login == 0):
|
|
return render.base(session, render.login_required(), [], [])
|
|
|
|
return render.base(session, render.mod(['Defense of the Ancients']), [], [])
|
|
|
|
class mod_create:
|
|
def __init__(self):
|
|
self.e = xml.etree.ElementTree.parse('cache/c0').getroot()
|
|
self.cards = self.defaultSchema()
|
|
|
|
def defaultSchema(self):
|
|
f = open('cache/cards.basic')
|
|
default = f.read()
|
|
f.close()
|
|
|
|
alias = []
|
|
for atype in self.e.findall("Entity"):
|
|
card = atype.get("CardID")
|
|
if(default.find("[%s]" % card) == -1):
|
|
continue
|
|
for t in atype.findall("Tag"):
|
|
if(t.get("enumID") == "185"):
|
|
alias.append([card, t.text])
|
|
return alias
|
|
|
|
def cardTags(self, dst, e):
|
|
tags = []
|
|
tags.append(["__name", dst, "cardcode"])
|
|
for atype in e.findall("Entity"):
|
|
if(atype.get("CardID") == dst):
|
|
for t in atype.findall("Tag"):
|
|
key = t.get("enumID")
|
|
m = t.get("type")
|
|
if(m == ""):
|
|
tags.append([key, t.get("value"), tagsDict[int(key)]])
|
|
elif(m == "String"):
|
|
tags.append([key, t.text, tagsDict[int(key)]])
|
|
else:
|
|
abort()
|
|
try:
|
|
f = open("../hm_gameserver/script/mechanics/cards/%s.card" % dst, "r")
|
|
r = f.read()
|
|
f.close()
|
|
tags.append(['__code', r, 'mechanics'])
|
|
except:
|
|
tags.append(['__code', "{}", 'mechanics'])
|
|
|
|
j = json.dumps(tags)
|
|
|
|
return j
|
|
|
|
def modCards(self, card, tags, enabledCards):
|
|
|
|
customName = ''
|
|
b = 'card=%s tags={' % card
|
|
for t in tags:
|
|
if(t.get("type") == ""):
|
|
b += "%s:%s," % (t.get("enumID"), t.get("value"))
|
|
if(t.get("type") == "String" and t.get("enumID") == "185"):
|
|
customName = t.text
|
|
if(t.get("type") == "String" and t.get("enumID") == "184"):
|
|
r = re.findall("\$[\w]+\ ", t.text)
|
|
if(len(r) > 0):
|
|
b += "47:%s," % r[0].replace(" ", "").replace("$", "")
|
|
|
|
b += '} custom=1'
|
|
enabledCards = enabledCards.replace("[%s]" % card, "name=\"%s\" %s" % (customName, b))
|
|
return enabledCards
|
|
|
|
def modPublish(self, modName):
|
|
try:
|
|
print 'publishing mod ' + modName
|
|
loaded = cb.get('u:mod_woa').value
|
|
names = []
|
|
|
|
f = open('cache/cards.basic')
|
|
enabledCards = f.read()
|
|
f.close()
|
|
|
|
for atype in self.e.findall("Entity"):
|
|
for new in loaded['cards']:
|
|
if(atype.get("CardID") == new[0][1]):
|
|
for t in atype.findall("Tag"):
|
|
for tag in new:
|
|
if(tag[0] == t.get("enumID")):
|
|
|
|
key = t.get("enumID")
|
|
m = t.get("type")
|
|
|
|
if(m == ""):
|
|
t.set("value", tag[1])
|
|
elif(m == "String"):
|
|
t.text = tag[1]
|
|
else:
|
|
abort()
|
|
|
|
enabledCards = self.modCards(new[0][1], atype.findall("Tag"), enabledCards)
|
|
break
|
|
f = open("customMod", "w")
|
|
f.write(enabledCards)
|
|
f.close()
|
|
|
|
xmlstr = xml.etree.ElementTree.tostring(self.e, encoding='utf8', method='xml')
|
|
|
|
f = open("cache/cardsxml_p1", "rb")
|
|
p1 = f.read()
|
|
f.close()
|
|
|
|
f = open("cache/cardsxml_p3", "rb")
|
|
p3 = f.read()
|
|
f.close()
|
|
|
|
f = open("test", "w")
|
|
f.write(p1 + xmlstr[38:] + p3)
|
|
f.close()
|
|
|
|
|
|
return "success"
|
|
|
|
except:
|
|
return "fail"
|
|
|
|
def enabledCardRemove(self, j):
|
|
try:
|
|
loaded = cb.get('u:mod_woa').value
|
|
# delete if element exists
|
|
for l in loaded['cards']:
|
|
if l[0][1] == j:
|
|
loaded['cards'].remove(l)
|
|
break
|
|
cb.upsert('u:mod_woa', loaded)
|
|
|
|
names = []
|
|
for l in loaded['cards']:
|
|
names.append([l[0][1], l[1][1]])
|
|
|
|
return json.dumps(names)
|
|
|
|
except:
|
|
cb.upsert('u:mod_woa', {"cards": [j]})
|
|
|
|
return ""
|
|
|
|
def getStored(self):
|
|
try:
|
|
x = cb.get('u:mod_woa')
|
|
loaded = x.value
|
|
except:
|
|
return []
|
|
|
|
names = []
|
|
for l in loaded['cards']:
|
|
names.append([l[0][1], l[1][1]])
|
|
|
|
return json.dumps(names)
|
|
|
|
def storeLoaded(self, j):
|
|
try:
|
|
loaded = cb.get('u:mod_woa').value
|
|
# replace if element exists
|
|
for l in loaded['cards']:
|
|
if l[0][1] == j[0][1]:
|
|
loaded['cards'].remove(l)
|
|
break
|
|
loaded['cards'].append(j)
|
|
cb.upsert('u:mod_woa', loaded)
|
|
except:
|
|
cb.upsert('u:mod_woa', {"cards": [j]})
|
|
|
|
loaded = cb.get('u:mod_woa').value
|
|
|
|
names = []
|
|
for l in loaded['cards']:
|
|
names.append([l[0][1], l[1][1]])
|
|
|
|
gen(j);
|
|
|
|
return json.dumps(names)
|
|
|
|
def modifiedCardTags(self, j):
|
|
#try:
|
|
loaded = cb.get('u:mod_woa').value
|
|
for l in loaded['cards']:
|
|
if l[0][1] == j:
|
|
names = []
|
|
for i in l:
|
|
if(i[0] == '__name'):
|
|
names.append([i[0], i[1], "cardcode"])
|
|
elif(i[0] == '__code'):
|
|
names.append([i[0], i[1], "mechanics"])
|
|
else:
|
|
names.append([i[0], i[1], tagsDict[int(i[0])]])
|
|
|
|
return json.dumps(names)
|
|
|
|
return ""
|
|
|
|
def isAuth(self):
|
|
if session.login == 1 and session.user == 'john':
|
|
print 'auth yes'
|
|
return 1
|
|
else:
|
|
print 'auth no'
|
|
return 0
|
|
|
|
|
|
def POST(self):
|
|
|
|
j = json.loads(web.data())
|
|
|
|
if(j == None):
|
|
return '{}'
|
|
|
|
if(len(j) == 1):
|
|
if 'modified' in j:
|
|
return self.modifiedCardTags(j['modified'])
|
|
|
|
elif 'card' in j:
|
|
return self.cardTags(j['card'], self.e)
|
|
|
|
elif 'remove' in j:
|
|
if not self.isAuth():
|
|
return '{}'
|
|
return self.enabledCardRemove(j['remove'])
|
|
|
|
elif 'publish' in j:
|
|
if not self.isAuth():
|
|
return '{}'
|
|
|
|
result = self.modPublish(j['publish'])
|
|
if(result == "success"):
|
|
os.system("sh test.sh")
|
|
|
|
return result
|
|
|
|
else:
|
|
if(self.isAuth()):
|
|
return self.storeLoaded(j)
|
|
else:
|
|
return '{}'
|
|
|
|
def GET(self):
|
|
if(session.login == 0):
|
|
return render.base(session, render.login_required(), [], [])
|
|
|
|
try:
|
|
stored = json.loads(self.getStored())
|
|
except:
|
|
stored = '{}'
|
|
return render.base(session, render.mod_create(self.cards, len(self.cards), stored), [], [])
|
|
|
|
|
|
class signup:
|
|
|
|
def signup(self, arr):
|
|
session.login = 0
|
|
|
|
e = arr['email']
|
|
p = arr['pass']
|
|
p1 = arr['pass1']
|
|
|
|
if(len(e) < 2 or len(p) < 2):
|
|
return ERR_1
|
|
if(p != p1):
|
|
return ERR_1
|
|
|
|
cb.upsert('u:%s' % e, {'email': e, 'password': p, 'secret': rand(6)})
|
|
|
|
return ERR_0
|
|
|
|
def GET(self):
|
|
return render.base(session, render.signup(), [], [])
|
|
|
|
def POST(self):
|
|
|
|
r = self.signup(json.loads(web.data()))
|
|
return r
|
|
|
|
class signin:
|
|
def signin(self, arr):
|
|
session.login = 0
|
|
session.user = ''
|
|
e = arr['user']
|
|
p = arr['pass']
|
|
if(len(e) < 2 or len(p) < 2):
|
|
session.login = 0
|
|
return ERR_1
|
|
|
|
try:
|
|
out = cb.get('u:%s' % e).value
|
|
for o in out:
|
|
if(o == 'password'):
|
|
if(p == out[o]):
|
|
session.login = 1
|
|
session.secret = out['secret']
|
|
session.user = e
|
|
return ERR_0
|
|
else:
|
|
session.login = 0
|
|
return ERR_3
|
|
return ERR_2
|
|
except:
|
|
return ERR_2
|
|
|
|
def GET(self):
|
|
return render.base(session, render.signin(), [], [])
|
|
|
|
def POST(self):
|
|
d = json.loads(web.data())
|
|
|
|
r = self.signin(d)
|
|
return r
|
|
|
|
class deck:
|
|
def save_deck(self, arr):
|
|
|
|
out = cb.set('u:deck_%s' % session.secret, arr)
|
|
|
|
return ERR_0
|
|
|
|
|
|
def GET(self):
|
|
if(session.login == 0):
|
|
return render.base(session, render.login_required(), [], [])
|
|
|
|
cards = []
|
|
loaded = cb.get('u:mod_woa').value
|
|
for l in loaded['cards']:
|
|
names = []
|
|
enabled = 0
|
|
for i in l:
|
|
if(i[0] == '185'):
|
|
names.append(i[1])
|
|
elif(i[0] == '__name'):
|
|
names.append(i[1])
|
|
elif(i[0] == '__code'):
|
|
enabled_pattern = r'enabled:(\d+)'
|
|
enabled_match = re.search(enabled_pattern, i[1])
|
|
if(enabled_match):
|
|
enabled = 1
|
|
names.append(int(enabled_match.group(1)))
|
|
if(i[1].find("\"boss\"") > -1):
|
|
names.append('boss')
|
|
else:
|
|
names.append('noboss')
|
|
|
|
if(len(names) != 0 and enabled == 1):
|
|
cards.append(names)
|
|
|
|
try:
|
|
loaded = cb.get('u:deck_%s' % session.secret).value
|
|
except:
|
|
loaded = {}
|
|
|
|
return render.base(session, render.deck(cards, loaded), loaded, cards)
|
|
|
|
def POST(self):
|
|
if(session.login == 0):
|
|
return render.base(session, render.login_required(), [], [])
|
|
|
|
r = self.save_deck(json.loads(web.data()))
|
|
return r
|
|
|
|
if __name__ == '__main__':
|
|
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
|
|
os.system("cd ../hm_sunwell/examples && npm start &")
|
|
|
|
app.run()
|