Skip to content

Commit

Permalink
refactoring,
Browse files Browse the repository at this point in the history
  • Loading branch information
d1ffuz0r committed Dec 25, 2011
1 parent 004e6b2 commit 8ae130f
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 64 deletions.
49 changes: 11 additions & 38 deletions engine.py
Expand Up @@ -8,23 +8,22 @@
from re import compile, search, DOTALL, findall
from cookielib import CookieJar

from modules.db import Player, Clan, Online, \
InOnline, Profession
from modules.db import Online, _online_now, add


class Parser(object):
"""Parser class.
To parse and save in storage information from html pages
"""

"""Parser class. To parse and save in storage information from html pages"""

def __init__(self, pause=5):
"""Initialization class
Keyword arguments:
pause -- pause between getting pages, in minutes (default 5)
def __init__(self, server='x5', pause=5):
"""
Initialization class
@param pause: pause between getting pages, in minutes (default 5)
"""
#todo to realize work with many servers (asterios, l2, theonline)
self.url = "http://www.l2planet.ws/?go=online&server=x5"
self.url = "http://www.l2planet.ws/?go=online&server=%s" % server
self.regexp = compile(r'<table\sclass="sort"><thead>.*</thead><tbody>(.*?)</tbody></table>', DOTALL)
self.regexp2 = compile(r'<tr><td>.*?</td><td>(?P<name>.*?)</td><td>.*?</td><td>.*?</td><td>(?P<prof>.*?)</td><td>(?P<clan>.*?)</td><td>.*?</td></tr>')
self.pause = pause
Expand All @@ -38,40 +37,14 @@ def get_content(self):
page = urlopen(Request(self.url, headers=self.headers))
return page.read()

def add(self, name, profa, clan):
"""Get or create information in database
Keyword arguments:
name -- name user
profa -- profession name
clan -- clan name
"""
clan = Clan.get_or_create(name=clan)
profa = Profession.get_or_create(name=profa)
name = Player.get_or_create(name=name, profession=profa, clan=clan)
logging.warning({"clan": clan, "profa": profa, "name": name})
return {"clan": clan, "profa": profa, "name": name}

def _online_now(self, data):
"""To append all users who in online now
Keyword arguments:
data -- all players in online
"""
online_now = data['time']
for player in data["online"]:
InOnline.create(player=player["name"], online=online_now)

def parse(self):
"""Parse page"""
time = Online().create(date=datetime.datetime.now())
res = {"time": time, "online": []}
html = search(self.regexp, self.get_content()).group(1).replace('\r\n', '')
for line in findall(self.regexp2, html):
res["online"].append(self.add(line[0], line[1], line[2]))
self._online_now(res)
res["online"].append(add(line[0], line[1], line[2]))
_online_now(res)

def start(self):
"""Start engine"""
Expand Down
74 changes: 50 additions & 24 deletions modules/db.py
@@ -1,4 +1,5 @@
from datetime import datetime
import logging

from config import conf
from modules.peewee import MySQLDatabase, Model, CharField,\
Expand All @@ -19,10 +20,10 @@ class Meta:


class Profession(BaseModel):
"""Profession model. To store profession names
"""
Profession model. To store profession names
Keyword arguments:
name -- profession name
@param name: name of profession
tablename: profession
"""
Expand All @@ -36,10 +37,10 @@ def __unicode__(self):


class Clan(BaseModel):
"""Clan model. To store clans names
"""
Clan model. To store clans names
Keyword arguments:
name -- clan name
@param name: name of clan
tablename: clan
"""
Expand All @@ -53,10 +54,10 @@ def __unicode__(self):


class Online(BaseModel):
"""Online model. To store online stamp
"""
Online model. To store online stamp
Keyword arguments:
date -- datetime stamp
@param date: timeshtamp when make parse
tablename: online
"""
Expand All @@ -70,12 +71,12 @@ def __unicode__(self):


class Player(BaseModel):
"""Player model. To store player information's
"""
Player model. To store player information's
Keyword arguments:
name -- player nmame
profession -- profession id
clan -- clan id
@param name: name of player
@param profession: profession id
@param clan: clan id
tablename: player
"""
Expand All @@ -91,11 +92,11 @@ def __unicode__(self):


class InOnline(BaseModel):
"""InOnline model. To store relations between Player and Online models
"""
InOnline model. To store relations between Player and Online models
Keyword arguments:
player -- player id
online -- inline id
@param player: player id
@param online: online id
tablename: online_players
"""
Expand Down Expand Up @@ -124,13 +125,13 @@ def create_tables():


def get_by_nick(nick=None, frm=None, to=None):
"""To get order by nick
Keyword arguments:
nick -- player name
frm -- filter date from
to -- filter date to
"""
To get order by nick
@param nick: player name
@param frm: filter date from
@param to: filter date to
@return dict: dates and player state
"""
if nick:
player = Player.select().where(name=nick).get()
Expand Down Expand Up @@ -168,3 +169,28 @@ def get_by_nick(nick=None, frm=None, to=None):
return {'all': dates, 'player': all}
else:
return None

def add(name, profa, clan):
"""
Get or create information in database
@param name: name user
@param profa: profession name
@param clan: clan name
@return dict:
"""
clan = Clan.get_or_create(name=clan)
profa = Profession.get_or_create(name=profa)
name = Player.get_or_create(name=name, profession=profa, clan=clan)
logging.warning({"clan": clan, "profa": profa, "name": name})
return {"clan": clan, "profa": profa, "name": name}

def _online_now(data):
"""
To append all users who in online now
@param data: all players in online
"""
online_now = data['time']
for player in data["online"]:
InOnline.create(player=player["name"], online=online_now)
4 changes: 2 additions & 2 deletions tests/parser.py
Expand Up @@ -9,7 +9,7 @@ def setUp(self):
self.parser1 = Parser("x5")
self.parser2 = Parser("x1")
self.parser = Parser("x5")
self.parser.url = "file:///F:/x5.htm"
self.parser.url = "file:///D:/C/x5.htm"

def test_create(self):
self.assertIsNotNone(self.parser)
Expand All @@ -19,7 +19,7 @@ def test_params(self):
"http://www.l2planet.ws/?go=online&server=x5")
self.assertEqual(self.parser2.url,
"http://www.l2planet.ws/?go=online&server=x1")
self.assertEqual(self.parser.pause, 0)
self.assertEqual(self.parser.pause, 5)
self.assertEqual(self.parser.headers,
{"User-Agent": "Mozilla/4.0 (compatible; MSIE 7; WindowsNT)"})

Expand Down

0 comments on commit 8ae130f

Please sign in to comment.