tradey.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #!/usr/bin/python
  2. """
  3. Copyright 2011, Dipesh Amin <yaypunkrock@gmail.com>
  4. Copyright 2011, Stefan Beller <stefanbeller@googlemail.com>
  5. This file is part of tradey, a trading bot in the mana world
  6. see www.themanaworld.org
  7. """
  8. import time
  9. import os
  10. import xml.dom.minidom
  11. from subprocess import call
  12. from xml.etree.ElementTree import *
  13. def clean_xml(parse):
  14. data = ''
  15. pos_start = 0
  16. while parse.find('<', pos_start) != -1:
  17. pos_start = parse.find('<', pos_start)
  18. pos_end = parse.find('>', pos_start+1)
  19. data += parse[pos_start:pos_end+1]
  20. pos_start = pos_end
  21. return data
  22. class UserTree:
  23. def __init__(self):
  24. self.tree = ElementTree(file="data/user.xml")
  25. self.root = self.tree.getroot()
  26. def add_user(self, name, stalls, al):
  27. if self.get_user(name) == -10:
  28. user = SubElement(self.root, "user")
  29. user.set("name", name)
  30. user.set("stalls", str(stalls))
  31. user.set("used_stalls", str(0))
  32. user.set("money", str(0))
  33. user.set("id", str(0))
  34. user.set("accesslevel", str(al))
  35. self.save()
  36. def get_user(self, name):
  37. for elem in self.root:
  38. if elem.get("name") == name:
  39. return elem
  40. return -10
  41. def remove_user(self, name):
  42. for elem in self.root:
  43. if elem.get("name") == name:
  44. self.root.remove(elem)
  45. self.save()
  46. return 1
  47. return -10
  48. def save(self):
  49. # Be sure to call save() after any changes to the tree.
  50. f = open('data/user.xml', 'w')
  51. dom = xml.dom.minidom.parseString(clean_xml(tostring(self.root)))
  52. f.write(dom.toprettyxml(' '))
  53. f.close()
  54. class ItemTree:
  55. def __init__(self):
  56. self.save_file = 'data/sale.xml'
  57. self.tree = ElementTree(file=self.save_file)
  58. self.root = self.tree.getroot()
  59. self.u_id = set()
  60. self.id_itter = 1
  61. for elem in self.root:
  62. self.u_id.add(int(elem.get("uid")))
  63. def getId(self):
  64. while self.id_itter in self.u_id:
  65. self.id_itter += 1
  66. self.u_id.add(self.id_itter)
  67. return self.id_itter
  68. def remove_id(self, uid):
  69. # Free up used id's.
  70. self.u_id.remove(uid)
  71. def add_item(self, name, item_id, amount, price):
  72. user = SubElement(self.root, "item")
  73. user.set("name", name)
  74. user.set("itemId", str(item_id))
  75. user.set("price", str(price))
  76. user.set("add_time", str(time.time()))
  77. user.set("amount", str(amount))
  78. user.set("uid", str(self.getId()))
  79. self.save()
  80. def get_uid(self, uid):
  81. for elem in self.root:
  82. if elem.get("uid") == str(uid):
  83. return elem
  84. return -10
  85. def remove_item_uid(self, uid):
  86. for elem in self.root:
  87. if elem.get("uid") == str(uid):
  88. self.root.remove(elem)
  89. self.remove_id(uid)
  90. self.save()
  91. return 1
  92. return -10
  93. def save(self):
  94. # Be sure to call save() after any changes to the tree.
  95. f = open(self.save_file, 'w')
  96. dom = xml.dom.minidom.parseString(clean_xml(tostring(self.root)))
  97. f.write(dom.toprettyxml(' '))
  98. f.close()
  99. class StackTree(ItemTree):
  100. def __init__(self):
  101. self.save_file = 'data/stack.xml'
  102. self.tree = ElementTree(file=self.save_file)
  103. self.root = self.tree.getroot()
  104. self.u_id = set()
  105. self.id_itter = 101
  106. self.next_id = self.id_itter
  107. for elem in self.root:
  108. self.u_id.add(int(elem.get("uid")))
  109. def add_item(self, name, item_id, amount, price):
  110. user = SubElement(self.root, "item")
  111. user.set("name", name)
  112. user.set("itemId", str(item_id))
  113. user.set("price", str(price))
  114. user.set("amount", str(amount))
  115. user.set("uid", str(self.getId()))
  116. self.save()
  117. # Here we take the oldest id put into stack.xml so we have FIFO
  118. def get_next_id(self):
  119. if len(self.u_id) == 0:
  120. self.next_id = self.id_itter
  121. return
  122. else:
  123. # TODO Here I'm handling rotation (gets a high number then
  124. # back to 101). Any better manners to do this?
  125. if min(self.u_id) - self.next_id < 0:
  126. next_uid = self.next_id - min(self.u_id)
  127. self.next_id = self.id_itter + next_uid + 1
  128. else:
  129. next_uid = min(self.u_id) - self.next_id
  130. self.next_id += next_uid
  131. return
  132. def remove_item_uid(self, uid):
  133. for elem in self.root:
  134. if elem.get("uid") == str(uid):
  135. self.root.remove(elem)
  136. self.remove_id(uid)
  137. self.save()
  138. return 1
  139. self.get_next_id()
  140. return -10
  141. class DelistedTree(ItemTree):
  142. def __init__(self):
  143. self.save_file = 'data/delisted.xml'
  144. self.tree = ElementTree(file=self.save_file)
  145. self.root = self.tree.getroot()
  146. self.u_id = set()
  147. self.id_itter = 301
  148. for elem in self.root:
  149. self.u_id.add(int(elem.get("uid")))
  150. def add_item(self, name, item_id, amount):
  151. user = SubElement(self.root, "item")
  152. user.set("name", name)
  153. user.set("itemId", str(item_id))
  154. user.set("amount", str(amount))
  155. user.set("uid", str(self.getId()))
  156. self.save()
  157. def saveData(commitmessage = "commit"):
  158. # This assumes the current working directory is the tradey directory.
  159. os.chdir("data")
  160. call(["git", "commit","-a", '-m "' + commitmessage + '"'])
  161. os.chdir("..")
  162. if __name__ == '__main__':
  163. print "Do not run this file directly. Run main.py"