3 from threading
import Thread
, Event
, Lock
6 from sqlalchemy
import create_engine
7 from sqlalchemy
.orm
import sessionmaker
8 from player
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(self
)
39 self
.tNoop
= Noop(self
)
40 self
.tQueryList
= QueryList(self
, self
.db
)
42 # function to do cleanup on exit
47 # database init and close
48 def dbInit(self
, filename
= None):
49 if(not filename
): filename
= 'sqlite:///%s.db' % (self
.user
)
50 self
.dbEngine
= create_engine(filename
)
52 #create tables (if !exist)
53 metadataPlayer
.create_all(self
.dbEngine
)
56 self
.dbSessionMaker
= sessionmaker(bind
=self
.dbEngine
)
57 self
.db
= self
.dbSessionMaker()
62 # server primitives: connect, send, request, disconnect
63 def connect(self
, host
= None, port
= None):
64 if(host
): self
.host
= host
65 if(port
): self
.port
= port
66 self
.socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
67 self
.socket
.connect((self
.host
, self
.port
))
72 self
.tQueryList
.stop()
78 self
.socket
.send(data
.encode('utf8')+chr(0))
80 def request(self
, request
, bufferlen
= 1024):
82 # discard everything not yet of interest (chat, mail, etc..)
83 self
.socket
.settimeout(0.0)
85 while(True): self
.socket
.recv(bufflen
)
87 self
.socket
.settimeout(None)
89 self
.socket
.send(request
.encode('utf8')+chr(0))
91 while(data
[-1:] != chr(0)):
92 data
+= self
.socket
.recv(bufferlen
)
93 return data
[:-1].decode('utf8')
97 self
.request('002%s;%s;%s' % (self
.user
, self
.passwd
, self
.version
))
99 def sfQueryTavern(self
):
100 r010
= self
.request('010')
102 data
= r010
[3:].split('/')
104 # questTime remaining
105 self
.questTime
= int(data
[456])
108 self
.quests
.parse(r010
)
110 def sfWardCity(self
, hours
= 1):
111 if(hours
< 1 or hours
> 10):
114 self
.request('502%i' % (int(hours
)))
116 except KeyboardInterrupt:
122 # getattribute of dynamic values
123 def __getattr__(self
, name
):
124 if(name
== 'cooldownArena'):
125 r010
= self
.request('010')
126 data
= r010
.split('/')
127 return int(data
[460])-int(data
[510])
131 return '<Session \'%s\'>' % (self
.name
)
136 class MyThread(Thread
):
137 def __init__(self
, name
= None):
138 Thread
.__init
__(self
, name
=name
)
145 Thread
.__init
__(self
, name
=self
.name
)
150 class Noop(MyThread
):
151 def __init__(self
, session
):
152 self
.session
= session
153 MyThread
.__init
__(self
, name
='Noop')
156 while(not self
.eStop
.isSet()):
157 self
.session
.send('999')
158 self
.eStop
.wait(50.0)
161 class QueryList(MyThread
):
162 def __init__(self
, session
, db
):
163 self
.session
= session
165 MyThread
.__init
__(self
)
168 playerCount
= self
.session
.request('007;%i' % (100000)).split('/')[-6]
170 while(not self
.eStop
.isSet()):
171 data
= self
.session
.request('007;%i' % (i
))
173 data
= data
[3:].split('/')
177 p
= self
.db
.query(Player
).filter(Player
.name
== data
[(j
*5) +1]).one()
178 except NoResultFound
, e
:
180 p
= Player(self
.session
)
181 p
.name
= data
[(j
*5) +1]
183 p
.honor
= int(data
[(j
*5) +4])
184 p
.guild
= data
[(j
*5) +2]
185 p
.level
= abs(int(data
[(j
*5) +3]))
186 #print ('%s%s(%i) of %s - %i' % (['~', '+'][new], p.name, p.level, p.guild, p.honor)).encode('unicode_escape', 'replace')