123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #!/usr/bin/python
- """
- Copyright 2011, Dipesh Amin <yaypunkrock@gmail.com>
- Copyright 2011, Stefan Beller <stefanbeller@googlemail.com>
- This file is part of tradey, a trading bot in the mana world
- see www.themanaworld.org
- """
- from xml.etree.ElementTree import ElementTree
- from player import Item
- import time
- import mutex
- import threading
- from net.packet_out import *
- allowed_chars = "abcdefghijklmnoprstquvwxyzABCDEFGHIJKLMNOPRSTQUVWXYZ1234567890-_+=!@$%^&*();'\"<>,.?/~`| "
- # Process a recieved ip address.
- def parse_ip(a):
- return "%s.%s.%s.%s" % ((a % 256),((a >> 8) % 256),((a >> 16) % 256),((a >> 24) % 256))
- # Remove colors from a message
- def remove_colors(msg):
- if len(msg) > 2:
- for f in range(len(msg)-2):
- while (len(msg) > f + 2) and (msg[f] == "#")\
- and (msg[f+1] == "#"):
- msg = msg[0:f]+msg[f+3:]
- return msg
- # Encode string - used with 4144 shop compatibility.
- def encode_str(value, size):
- output = ''
- base = 94
- start = 33
- while value:
- output += chr(value % base + start)
- value /= base
- while len(output) < size:
- output += chr(start)
- return output
- class ItemDB:
- """
- A simple class to look up information from the items.xml file.
- """
- def __init__(self):
- print "Loading ItemDB"
- self.item_names = {}
- self.itemdb_file = ElementTree(file="data/items.xml")
- for item in self.itemdb_file.getroot():
- ## Item declaration
- if item.get('id'):
- item3 = item
- item_struct = Item()
- item_struct.name = item3.get('name')
- item_struct.weight = int(item3.get('weight', 0))
- if item3.get('type'):
- item_struct.type = item3.get('type')
- item_struct.description = item3.get('description')
- self.item_names[int(item3.get('id'))] = item_struct
- ## Import statement
- elif item.get('name'):
- file2 = ElementTree(file=item.get('name'))
- for item2 in file2.getroot():
- if item2.get('name'):
- file3 = ElementTree(file=item2.get('name'))
- for item3 in file3.getroot():
- item_struct = Item()
- item_struct.name = item3.get('name')
- item_struct.weight = int(item3.get('weight', 0))
- if item3.get('type'):
- item_struct.type = item3.get('type')
- item_struct.description = item3.get('description')
- self.item_names[int(item3.get('id'))] = item_struct
- def getItem(self, item_id):
- return self.item_names[item_id]
- def findId(self, name):
- for item_id in self.item_names:
- if self.item_names[item_id].name == name:
- return item_id
- return -10 #Not found
- def parse_mail_cmdargs(s):
- if len(s) < 3:
- return "", ""
- if s[0] == '"':
- end = s.find('"', 1)
- if end > 0:
- return s[1:end], s[end+2:]
- else:
- return "", ""
- else:
- end = s.find(' ')
- return s[:end], s[end+1:]
- class ItemLog:
- """ Writes all sales to a log file, for later processing."""
- def __init__(self):
- self.log_file = 'data/logs/sale.log'
- def add_item(self, item_id, amount, price, name):
- file_node = open(self.log_file, 'a')
- file_node.write(str(item_id)+" "+str(amount)+" "+str(price)+" "+str(time.time())+" "+name+"\n")
- file_node.close()
- class TraderState:
- """ Stores information regarding a trade request"""
- def __init__(self):
- self.Trading = mutex.mutex()
- self.item = 0
- self.money = 0
- self.complete = 0
- self.timer = 0
- def reset(self):
- self.Trading.unlock()
- self.item = 0
- self.complete = 0
- self.money = 0
- self.timer = 0
- class Broadcast:
- """Send a message to the server every 5 minutes to avoid a timeout."""
- def __init__(self):
- self.mapserv = 0
- self.Active = False
- self.Timer = 0
- self.shop_broadcast = threading.Thread(target=self.send_broadcast, args=())
- def send_broadcast(self):
- while self.Active:
- if (time.time() - self.Timer) > 60:
- self.mapserv.sendall(emote(193))
- self.Timer = time.time()
- #print "shop_broadcast"
- else:
- time.sleep(0.1)
- def start(self):
- self.Active = True
- self.shop_broadcast.start()
- def stop(self):
- if self.Active:
- self.Active = False
- self.shop_broadcast.join()
- if __name__ == '__main__':
- print "Do not run this file directly. Run main.py"
|