3 from threading
import Thread
, Event
, Lock
6 from sqlalchemy
import create_engine
7 from sqlalchemy
.orm
import sessionmaker
8 from palyer
import metadata
as metadataPlayer
11 from player
import Player
12 from quest
import QuestList
16 def __init__(self
, user
, passwd
, host
= '213.165.80.92', port
= 8005, version
= 'v1.31'):
21 self
.version
= version
24 self
.character
= Player(self
, user
)
26 self
.quests
= QuestList()
39 self
.tNoop
= Noop(self
)
40 self
.tQueryList
= QueryList(self
, self
.db
)
42 # database init and close
43 def dbInit(self
, filename
= 'sqlite:///%s.db' % (self
.user
)):
44 self
.dbEngine
= create_engine(filename
)
46 #create tables (if !exist)
47 metadataPlayer
.create_all(self
.dbEngine
)
50 self
.dbSessionMaker
= sessionmaker(bind
=engine
)
51 self
.db
= self
.dbSessionMaker()
56 # server primitives: connect, send, request, disconnect
57 def connect(self
, host
= None, port
= None):
58 if(host
): self
.host
= host
59 if(port
): self
.port
= port
60 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
61 self
.socket
.connect((self
.host
, self
.port
))
66 self
.tQueryList
.stop()
72 self
.socket
.send(data
.encode('utf8')+chr(0))
74 def request(self
, request
, bufferlen
= 1024):
76 self
.socket
.send(request
.encode('utf8')+chr(0))
79 data
+= self
.socket
.recv(bufferlen
)
80 if(data
[-1:] == chr(0)): break
81 return data
[:-1].decode('utf8', 'replace')
85 self
.request('002%s;%s;%s' % (self
.user
, self
.passwd
, self
.version
))
87 def sfQueryTavern(self
):
88 r010
= session
.request('010')
90 data
= r010
[3:].split('/')
93 self
.questTime
= int(data
[456])
96 self
.quests
.parse(r010
)
98 def wardCity(self
, hours
= 1):
99 if(hours
< 1 or hours
> 10):
102 self
.request('502%i' % (int(hours
)))
104 except KeyboardInterrupt:
110 # getattribute of dynamic values
111 def __getattribute__(self
, name
):
112 if(name
== 'cooldownArena'):
113 r010
= self
.request('010')
114 data
= r010
.split('/')
115 return int(data
[460])-int(data
[510])
119 return '<Session \'%s\'>' % (self
.name
)
129 class MyThread(Thread
):
130 def __init__(self
, name
= None):
135 Thread
.__init
__(self
, name
=self
.name
)
146 class Noop(MyThread
):
147 def __init__(self
, session
):
148 self
.session
= session
149 MyThread
.__init
__(self
, name
='Noop')
152 while(not self
.eStop
.isSet()):
153 self
.session
.send('999')
154 self
.eStop
.wait(50.0)
157 class QueryList(MyThread
):
158 def __init__(self
, session
, db
):
159 self
.session
= session
163 playerCount
= self
.session
.request('007;%i' % (100000)).split('/')[-6]
165 while(not self
.eStop
.isSet()):
166 data
= self
.session
.request('007;%i' % (i
))
168 data
= data
[3:].split('/')
172 p
= self
.db
.query(Player
).filter(Player
.name
== data
[(j
*5) +1]).one()
173 except NoResultFound
, e
:
175 p
= Player(self
.session
)
176 p
.name
= data
[(j
*5) +1]
178 p
.honor
= int(data
[(j
*5) +4])
179 p
.guild
= data
[(j
*5) +2]
180 p
.level
= abs(int(data
[(j
*5) +3]))
181 #print ('%s%s(%i) of %s - %i' % (['~', '+'][new], p.name, p.level, p.guild, p.honor)).encode('unicode_escape', 'replace')