(→Cannot run script: Solved) |
m (Jesusalva moved page Talk:Item Reference to Legacy talk:Item Reference: Legacy namespace prevails) |
||
(7 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
==Continuing script maintenance== | |||
Script failed attempting to resurrect, but I'm not sure how I feel about the item categories created. | |||
==Multiple Links to same page== | |||
It appears from here that this page links to the Legacy Items with the same information on it. I don't know if it is necessary or not. The same goes from the Legacy Items page, in that it links to itself in its list. [[User:DeadManWalking|DeadManWalking]] ([[User talk:DeadManWalking|talk]]) 17:06, 19 July 2017 (EDT) | |||
==Archives== | ==Archives== | ||
Line 25: | Line 32: | ||
I have tried to understand the script so I can solve it myself, but I do not really understand the logic of what the code is trying to do or the logic of python’s error message. It seems I need to learn more scripting and python as well. ✎ [[User:Kess|Kess]]<sup>[[User talk:Kess|☽]]</sup> 10:48, 7 November 2008 (CET) | I have tried to understand the script so I can solve it myself, but I do not really understand the logic of what the code is trying to do or the logic of python’s error message. It seems I need to learn more scripting and python as well. ✎ [[User:Kess|Kess]]<sup>[[User talk:Kess|☽]]</sup> 10:48, 7 November 2008 (CET) | ||
: I have solved this part, just needed to take the time to understand the script and update/fix the relevant parts. I will update the item pages in a few days time when I have ironed out some ‘small’ issues like dyed items and rarity. At that time I think I’ll make another archive of this talk page as well. | : I have solved this part, just needed to take the time to understand the script and update/fix the relevant parts. I will update the item pages in a few days time when I have ironed out some ‘small’ issues like dyed items and rarity. At that time I think I’ll make another archive of this talk page as well. ✎ [[User:Kess|Kess]]<sup>[[User talk:Kess|☽]]</sup> 19:50, 10 November 2008 (CET) | ||
:: I do not have this time currently. The latest state of the script is available here: [[User talk:Kess/Sandbox]], with output as shown here: [[User:Kess/Sandbox]]. Feel free to use it or skip it. I might get back to this next year. Depends on where my priorities will lie. ✎ [[User:Kess|Kess]]<sup>[[User talk:Kess|☽]]</sup> 15:26, 18 November 2008 (CET) | |||
== How to create this page == | == How to create this page == | ||
Line 96: | Line 104: | ||
] | ] | ||
imagesused = | imagesused = set() | ||
class whatever: pass | class whatever: pass | ||
Line 144: | Line 152: | ||
parentry = a | parentry = a | ||
elif mode == 3: #reading param | elif mode == 3: #reading param | ||
if ( | if a in (" ", ",", ";"): | ||
script[scriptentry].append(parentry) | script[scriptentry].append(parentry) | ||
parentry = "" | parentry = "" | ||
if | if a == ';': | ||
mode = 0 | mode = 0 | ||
scriptentry = "" | scriptentry = "" | ||
Line 170: | Line 178: | ||
objects = [] | objects = [] | ||
for line in file: | for line in file: | ||
s = line[ | s = line[:line.find('//')].strip().replace('\t','') | ||
if s: | if s: | ||
#Replace commas inbetween {} with |, so we can use split | #Replace commas inbetween {} with |, so we can use split | ||
Line 190: | Line 198: | ||
log.append("FOUND COMMENT LINE: %s" % str(values)) | log.append("FOUND COMMENT LINE: %s" % str(values)) | ||
continue | continue | ||
if | if len(values) != 20: | ||
log.append("item_db: Warning, item-line with ID %s has %d values instead of 19" % (values[0], len(values))) | log.append("item_db: Warning, item-line with ID %s has %d values instead of 19" % (values[0], len(values))) | ||
if debug: | if debug: | ||
log.append(" line was %s" % str(values)) | log.append(" line was %s" % str(values)) | ||
while | while len(values) < 20: | ||
values.append('') | values.append('') | ||
while | while len(values) > 20: | ||
values.pop() | values.pop() | ||
o = whatever() | o = whatever() | ||
Line 239: | Line 247: | ||
index = 0 | index = 0 | ||
debug = 0 | debug = 0 | ||
while s[index:] | while pre in s[index:]: | ||
index += s[index:].find(pre) + len(pre) | index += s[index:].find(pre) + len(pre) | ||
curitem = {} | curitem = {} | ||
Line 252: | Line 260: | ||
start = termstart | start = termstart | ||
if | if start < termstart: | ||
curitem[attr] = s[start:end] | curitem[attr] = s[start:end] | ||
for a in intattrs: | for a in intattrs: | ||
try: | try: | ||
if curitem | if a in curitem: curitem[a] = int(curitem[a]) | ||
except: | except: | ||
log.append("Item-ID %s: Cannot convert integer attribute %s to an integer. Value: '%s'" % (curitem["id"], a, curitem[a])) | log.append("Item-ID %s: Cannot convert integer attribute %s to an integer. Value: '%s'" % (curitem["id"], a, curitem[a])) | ||
Line 272: | Line 280: | ||
def addclientinformation(items,citems): | def addclientinformation(items,citems): | ||
for i in items: | for i in items: | ||
if | if i.id in citems: | ||
i.imagename=citems[i.id]["image"] | i.imagename=citems[i.id]["image"] | ||
url=i.imagename[0].upper() + i.imagename[1:] | url=i.imagename[0].upper() + i.imagename[1:] | ||
i.imgurl = "[[Image:"+ url + "]]" | i.imgurl = "[[Image:"+ url + "]]" | ||
imagesused | imagesused.add( citems[i.id]["image"]) | ||
i.description = citems[i.id]["description"] | i.description = citems[i.id]["description"] | ||
i.clientname = citems[i.id]["name"] | i.clientname = citems[i.id]["name"] | ||
Line 292: | Line 298: | ||
## Returns sorted lists of items by itemtype | ## Returns sorted lists of items by itemtype | ||
def gettypedir(items): | def gettypedir(items): | ||
items.sort(lambda x | items.sort(key=lambda x: x.price+x.sell) | ||
typedir = whatever() | typedir = whatever() | ||
Line 303: | Line 309: | ||
typedir.other = [] | typedir.other = [] | ||
for item in items: | for item in items: | ||
if | if item.imgurl.strip() or item.clientname.strip(): | ||
#if item.id == 537: log.append('"%s", "%s"' % (item.imgurl, item.name) | #if item.id == 537: log.append('"%s", "%s"' % (item.imgurl, item.name) | ||
if | if item.atk > 0: | ||
if item.defense == 0: typedir.weapons.append(item) | if item.defense == 0: typedir.weapons.append(item) | ||
else: typedir.combos.append(item) | else: typedir.combos.append(item) | ||
elif | elif item.defense > 0: typedir.armor.append(item) | ||
elif item.usescript | elif "itemheal" in item.usescript: | ||
if item.usescript["itemheal"][0] > item.usescript["itemheal"][1]: | if item.usescript["itemheal"][0] > item.usescript["itemheal"][1]: | ||
typedir.healthy.append(item) | typedir.healthy.append(item) | ||
else: | else: | ||
typedir.inspiring.append(item) | typedir.inspiring.append(item) | ||
elif item.usescript | elif "sc_start" in item.usescript: | ||
typedir.status.append(item) | typedir.status.append(item) | ||
else: typedir.other.append(item) | else: typedir.other.append(item) | ||
typedir.weapons.sort(lambda x | typedir.weapons.sort(key=lambda x: x.atk) | ||
typedir.armor.sort(lambda x | typedir.armor.sort(key=lambda x: x.defense) | ||
typedir.combos.sort(lambda x | typedir.combos.sort(key=lambda x: x.defense+x.atk) | ||
typedir.healthy.sort(lambda x | typedir.healthy.sort(key=lambda x: int(x.usescript["itemheal"][0])) | ||
typedir.inspiring.sort(lambda x | typedir.inspiring.sort(key=lambda x: int(x.usescript["itemheal"][1])) | ||
#typedir.other.sort(lambda x | #typedir.other.sort(key=lambda x: x.price+x.sell) | ||
typedir.status.sort(lambda x | typedir.status.sort(key=lambda x: x.price+x.sell) | ||
return typedir | return typedir | ||
Line 336: | Line 342: | ||
global log | global log | ||
if len(log) > 0: | if len(log) > 0: | ||
print '\n---------------------------------------' | |||
for line in log: | for line in log: | ||
print line | |||
Line 350: | Line 356: | ||
def printhealitems(items,title): | def printhealitems(items,title): | ||
print '==%s==' % title | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' | |||
# Print labels | # Print labels | ||
for title in health_titles: | for title in health_titles: | ||
print '! style="background:#efdead;" | %s' % title | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
print '| align="center" | %d' % i.usescript["itemheal"][0] | |||
print '| align="center" | %d' % i.usescript["itemheal"][1] | |||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| align="center!" | %d' % i.weight | |||
print '| %s' % i.description | |||
print '|}\n' | |||
def printstatusitems(items,title): | def printstatusitems(items,title): | ||
print '==%s==\n' % title) | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n') | |||
# Print labels | # Print labels | ||
for title in status_titles: | for title in status_titles: | ||
print '! style="background:#efdead;" | %s' % title | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
print '| align="center" | %s' % i.usescript["sc_start"][0] | |||
print '| align="center" | %s' % i.usescript["sc_start"][1] | |||
print '| align="center" | %s' % i.usescript["sc_start"][2] | |||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| align="center!" | %d' % i.weight | |||
print '| %s' % i.description | |||
print '|}\n' | |||
def printweaponitems(items, title): | def printweaponitems(items, title): | ||
print '==%s==\n' % title) | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n') | |||
# Print labels | # Print labels | ||
for title in weapon_titles: | for title in weapon_titles: | ||
print '! style="background:#efdead;" | %s\n' % title) | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
print '| align="center" | %d (%d)' % (i.atk,i.range) | |||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| align="center!" | %d' % i.weight | |||
print '| %s' % i.description | |||
print '|}\n' | |||
def printarmoritems(items, title): | def printarmoritems(items, title): | ||
print '==%s==' % title | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' | |||
print '! style="background:#efdead;" | Image' | |||
print '! style="background:#efdead;" | Name' | |||
print '! style="background:#efdead;" | ID' | |||
print '! style="background:#efdead;" | Defense' | |||
print '! style="background:#efdead;" | Price<br>BUY/Sell' | |||
print '! style="background:#efdead;" | Description' | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
print '| align="center" | %d' % i.defense | |||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| %s' % i.description | |||
print '|}\n' | |||
def printcomboitems(items, title): | def printcomboitems(items, title): | ||
print '==%s==' % title | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' | |||
print '! style="background:#efdead;" | Image' | |||
print '! style="background:#efdead;" | Name' | |||
print '! style="background:#efdead;" | ID' | |||
print '! style="background:#efdead;" | Damage<br>(Range)' | |||
print '! style="background:#efdead;" | Defense' | |||
print '! style="background:#efdead;" | Price<br>BUY/Sell' | |||
print '! style="background:#efdead;" | Description' | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
print '| align="center" | %d (%d)' % (i.atk,i.range) | |||
print '| align="center" | %d' % i.defense | |||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| %s' % i.description | |||
print '|}\n' | |||
def getpropertystring(item): | def getpropertystring(item): | ||
Line 466: | Line 472: | ||
def printotheritems(items, title): | def printotheritems(items, title): | ||
print '==%s==' % title | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' | |||
print '! style="background:#efdead;" | Image' | |||
print '! style="background:#efdead;" | Name' | |||
print '! style="background:#efdead;" | ID' | |||
# | #print '! style="background:#efdead;" | Type' | ||
# | #print '! style="background:#efdead;" | Properties' | ||
print '! style="background:#efdead;" | Price<br>BUY/Sell' | |||
print '! style="background:#efdead;" | Description' | |||
for i in items: | for i in items: | ||
print '|-' | |||
print '| align="center" | %s' % i.imgurl | |||
# | #print '| %s' % i.jname.replace('_',' ') | ||
print '| %s' % i.clientname | |||
sys.stdout.write( getidstring(i.id) ) | sys.stdout.write( getidstring(i.id) ) | ||
# | #print '| align="center" | %d' % i.type | ||
# | #print '| align="center" | %s' % getpropertystring(i) | ||
sys.stdout.write( getmoneystring(i.price,i.sell) ) | sys.stdout.write( getmoneystring(i.price,i.sell) ) | ||
print '| %s' % i.description | |||
print '|}\n' | |||
def printunuseditems(title): | def printunuseditems(title): | ||
ids = [] | ids = [] | ||
for i in range(1,len(imageurls)): | for i in range(1,len(imageurls)): | ||
if not imagesused | if i not in imagesused: | ||
ids.append(i) | ids.append(i) | ||
if len(ids): | if len(ids): | ||
print '==%s==' % title | |||
print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' | |||
print '|', | |||
for i in ids: | for i in ids: | ||
print imageurls[i], | |||
print '\n|}\n' | |||
Line 511: | Line 515: | ||
try: | try: | ||
if | if len(sys.argv) == 1: | ||
item_db = "item_db.txt" | item_db = "item_db.txt" | ||
item_xml = "items.xml" | item_xml = "items.xml" | ||
elif | elif len(sys.argv) == 3: | ||
item_db = sys.argv[1] | item_db = sys.argv[1] | ||
item_xml = sys.argv[2] | item_xml = sys.argv[2] | ||
Line 520: | Line 524: | ||
item_db = '' | item_db = '' | ||
item_xml = '' | item_xml = '' | ||
print "Wrong number of arguments" | |||
if item_db and | if item_db and not os.path.isfile(item_db): | ||
print "File does not exist: %s" % item_db | |||
item_db = '' | item_db = '' | ||
if item_xml and | if item_xml and not os.path.isfile(item_xml): | ||
print "File does not exist: %s" % item_xml | |||
item_db = '' | item_db = '' | ||
if not (item_db and item_xml): | if not (item_db and item_xml): | ||
print "\nUSAGE:" | |||
print "dbtowiki without any arguments will use item_db.txt and items.xml in the current directory." | |||
print "to specify custom files, call: dbtowiki <item_db> <item_xml>" | |||
exit(-1); | exit(-1); | ||
else: | else: | ||
Line 554: | Line 558: | ||
if checkimagesonwiki: | if checkimagesonwiki: | ||
print "Checking for images on wiki: " | |||
images = [] | images = [] | ||
for item in typedir.healthy: | for item in typedir.healthy: | ||
Line 576: | Line 580: | ||
'Image:%s"' % fixedimagename | 'Image:%s"' % fixedimagename | ||
if debug: | if debug: | ||
print "CHECKING URL: %s" % curlstring | |||
p=popen2.Popen4(curlstring) | p=popen2.Popen4(curlstring) | ||
# this could hang if there is a lot of output! | # this could hang if there is a lot of output! | ||
returncode = p.wait() # wait for the process to finish | returncode = p.wait() # wait for the process to finish | ||
if debug: | if debug: | ||
print "Process finished with %d" % returncode | |||
page = p.fromchild.read() | page = p.fromchild.read() | ||
if debug >= 3: | if debug >= 3: | ||
print "Read: %s" % page | |||
if | if "No file by this name exists" in page: | ||
need_to_upload.append((imagename, description)) | need_to_upload.append((imagename, description)) | ||
if debug: | if debug: | ||
print "NEED TO UPLOAD: %s" % need_to_upload[-1] | |||
Line 598: | Line 601: | ||
curlstring = 'curl -d "wpName=%s&wpPassword=%s&wpLoginattempt=Log+in" -c cookie-jar "http://wiki.themanaworld.org/index.php?title=Special:Userlogin&action=submitlogin&type=login"'% (wikiuser, wikipassword) | curlstring = 'curl -d "wpName=%s&wpPassword=%s&wpLoginattempt=Log+in" -c cookie-jar "http://wiki.themanaworld.org/index.php?title=Special:Userlogin&action=submitlogin&type=login"'% (wikiuser, wikipassword) | ||
print "Logging in as %s, your password can be seen " \ | |||
"in `ps ax`, also this is using http://... " | "in `ps ax`, also this is using http://... " \ | ||
"so be warned! | "so be warned!" % wikiuser | ||
p=popen2.Popen4(curlstring) | p=popen2.Popen4(curlstring) | ||
# this could hang if there is a lot of output! | # this could hang if there is a lot of output! | ||
Line 606: | Line 609: | ||
data = p.fromchild.read() | data = p.fromchild.read() | ||
if debug >= 1: | if debug >= 1: | ||
print "Read: %s" % data | |||
if | if "Login error" in data: | ||
print "Login failed" | |||
if debug: | if debug: | ||
print "Process finished with %d" % returncode | |||
sys.stdout.write("Now it is time to upload: %s" % | sys.stdout.write("Now it is time to upload: %s" % | ||
need_to_upload) | |||
for imagename, description in need_to_upload: | for imagename, description in need_to_upload: | ||
if debug: | if debug: | ||
print "Uploading image: %s" % imagename | |||
curlstring='curl -b cookie-jar -F "wpUploadFile=@%s/%s" -F "filename=%s" -F "wpDestFile=%s" -F "wpUploadDescription=%s" -F "wpUpload=Upload file" "http://wiki.themanaworld.org/index.php?title=Special:Upload"' % (image_path, imagename, imagename, imagename, description) | curlstring='curl -b cookie-jar -F "wpUploadFile=@%s/%s" -F "filename=%s" -F "wpDestFile=%s" -F "wpUploadDescription=%s" -F "wpUpload=Upload file" "http://wiki.themanaworld.org/index.php?title=Special:Upload"' % (image_path, imagename, imagename, imagename, description) | ||
Line 627: | Line 630: | ||
data = p.fromchild.read() | data = p.fromchild.read() | ||
if debug >= 1: | if debug >= 1: | ||
print "Read: %s" % data | |||
if debug: | if debug: | ||
print "Process finished with %d" % returncode | |||
print "Uploaded: %s, %s" % (imagename, description)) | |||
printunuseditems("Still unknown") | printunuseditems("Still unknown") | ||
print "\n" | |||
finally: | finally: |
Latest revision as of 02:08, 22 January 2020
Continuing script maintenance
Script failed attempting to resurrect, but I'm not sure how I feel about the item categories created.
Multiple Links to same page
It appears from here that this page links to the Legacy Items with the same information on it. I don't know if it is necessary or not. The same goes from the Legacy Items page, in that it links to itself in its list. DeadManWalking (talk) 17:06, 19 July 2017 (EDT)
Archives
Archives of outdated information from this talk page are here:
Problems
itemdbtowiki does not take enough arguments
In the future, itemdbtowiki should be modified to take some extra arguments from the command line, such as 'image_path', 'checkimagesonwiki', and perhaps the username and password.
[FIXED] Cannot run script
Output:
Item-ID -1: Cannot convert integer attribute type to an integer. Value: 'hairsprite' . . . Item-ID 1213: Cannot convert integer attribute type to an integer. Value: 'generic' Traceback (most recent call last): File "./itemdbtowiki.py", line 531, in <module> citems = parsexmlitems(f); File "./itemdbtowiki.py", line 252, in parsexmlitems items[curitem['id']] = curitem KeyError: 'id'
I have tried to understand the script so I can solve it myself, but I do not really understand the logic of what the code is trying to do or the logic of python’s error message. It seems I need to learn more scripting and python as well. ✎ Kess☽ 10:48, 7 November 2008 (CET)
- I have solved this part, just needed to take the time to understand the script and update/fix the relevant parts. I will update the item pages in a few days time when I have ironed out some ‘small’ issues like dyed items and rarity. At that time I think I’ll make another archive of this talk page as well. ✎ Kess☽ 19:50, 10 November 2008 (CET)
- I do not have this time currently. The latest state of the script is available here: User talk:Kess/Sandbox, with output as shown here: User:Kess/Sandbox. Feel free to use it or skip it. I might get back to this next year. Depends on where my priorities will lie. ✎ Kess☽ 15:26, 18 November 2008 (CET)
How to create this page
I have completed the new new script to recreate this page, please leave me a note if you find any problems. It is now capable of uploading new images to the wiki! --Hype0 02:42, 3 September 2007 (CEST)
You can run itemdbtowiki to generate the wiki page. The usage is:
itemdbtowiki <item_db.txt> <items.xml> > wikipage.txt
If run without any arguments, it'll look for item_db.txt and items.xml in the current directory.
To upload new images to the wiki automatically, 'checkimagesonwiki' in the file to 1 and set a corresponding valid 'wikiuser' and 'wikipassword' as well as set the 'image_path' to be correct (these are all parameters at the start of the script.)
Warning: if you choose to upload images, authentication will be done in plaintext, which is exactly what happens if you log in over http:// anyway... just thought you might like a reminder.
Python-Tools
itemdbtowiki
#!/usr/bin/python #Licensed under GNU General Public License import sys, os, popen2; import xml.parsers.expat debug=0 checkimagesonwiki=0 #wikiuser="Hype0" #wikipassword="password" image_path="/usr/home/dex/src/themanaworld/tmw/trunk/data/graphics/items" health_titles = ["Image","Name","ID","HP Bonus","SP Bonus", "Price<BR />BUY/Sell","Weight","Description"] status_titles = ["Image","Name","ID","Spell name","Parameter 1","Parameter 2", "Price<BR />BUY/Sell","Weight","Description"] weapon_titles = [" Image","Name","ID","Damage<BR />(Range)", "Price<BR />BUY/Sell","Weight","Description"] armor_titles = ["Image", "Name", "ID", "Defense", "Price<BR />BUY/Sell", "Weight","Description"] other_titles = ["Image","Name","ID","Price<BR />BUY/Sell", "Weight","Description "] imageurls = [ # The index represents the imageID from the items.xml of the client. "", # 0 "http://img52.imageshack.us/img52/3072/423xc.png", # 42 "http://img187.imageshack.us/img187/2963/434dc.png", # 43 "http://img125.imageshack.us/img125/4331/442fm.png", # 44 "http://img260.imageshack.us/img260/6627/456rj.png", # 45 "http://img211.imageshack.us/img211/9089/469fy.png", # 46 "http://img219.imageshack.us/img219/1188/479yz.png", # 47 "http://img232.imageshack.us/img232/3517/489oa.png", # 48 "http://img291.imageshack.us/img291/8643/491eg.png", # 49 "http://img157.imageshack.us/img157/1425/502hg.png", # 50 "http://img293.imageshack.us/img293/4524/514dn.png", # 51 "http://img42.imageshack.us/img42/7271/523hc.png", # 52 "http://img187.imageshack.us/img187/5241/535fk.png", # 53 "http://img125.imageshack.us/img125/8093/543yr.png", # 54 "http://img260.imageshack.us/img260/1315/554bt.png", # 55 "http://img211.imageshack.us/img211/9687/564wu.png", # 56 "http://img219.imageshack.us/img219/6842/571wz.png", # 57 "http://img232.imageshack.us/img232/9236/582ue.png", # 58 "http://img291.imageshack.us/img291/435/598ni.png", # 59 "http://img157.imageshack.us/img157/1323/605pt.png", # 60 "http://img293.imageshack.us/img293/1371/618fu.png", # 61 "http://img42.imageshack.us/img42/69/625mj.png", # 62 "http://img187.imageshack.us/img187/6240/637ju.png", # 63 "http://img275.imageshack.us/img275/9440/648zq.png", # 64 ] imagesused = set() class whatever: pass log = [] # parseitems(file) ## Returns list with items from eathena item_db file. def saveint(string, altval = 0): a = 0 try: a = int(string) except: a = altval return a def parsescript(s): # Assumes that there's only one call of each method, otherwise it would need to know # how to combine those function calls. In practice, the latter call would prevail. script = {} scriptentry = "" parentry = "" mode = 0 for a in s: if mode == 0: # looking for method if a.isalpha(): mode = 1 scriptentry += a elif a == '}': mode = 9 elif mode == 1: # reading method name if a in " ;}": if a == " ": mode = 2 elif a == ";": mode = 1 elif a == "}": mode = 9 parentry = "" script[scriptentry] = [] else: scriptentry += a elif mode == 2: #looking for param if a == " ": pass elif a == ";": mode = 0 scriptentry = "" else: mode = 3 parentry = a elif mode == 3: #reading param if a in (" ", ",", ";"): script[scriptentry].append(parentry) parentry = "" if a == ';': mode = 0 scriptentry = "" else: mode = 2 else: parentry += a elif mode == 9: #finished pass # Convert all possible parameters to integers for i in script.keys(): for j in range(len(script[i])): try: script[i][j] = int(script[i][j]) except: #print script[i][j] pass return script def parseitems(file): objects = [] for line in file: s = line[:line.find('//')].strip().replace('\t','') if s: #Replace commas inbetween {} with |, so we can use split mode = 0 sout = "" for a in s: if mode == 0: #Out of {} if a == '{': mode = 1 sout += a elif mode == 1: #Inside {} if a == ',': sout += '|' else: sout += a if a == '}': mode = 0 values = sout.split(',') if line[0] == '#': if debug: log.append("FOUND COMMENT LINE: %s" % str(values)) continue if len(values) != 20: log.append("item_db: Warning, item-line with ID %s has %d values instead of 19" % (values[0], len(values))) if debug: log.append(" line was %s" % str(values)) while len(values) < 20: values.append('') while len(values) > 20: values.pop() o = whatever() o.id = int(values[0]) o.name = values[1] o.jname = values[2] o.type = saveint(values[3]) o.price = saveint(values[4]) o.sell = saveint(values[5]) o.weight = saveint(values[6]) o.atk = saveint(values[7]) o.defense = saveint(values[8]) o.range = saveint(values[9]) o.mbonus = saveint(values[10]) o.slot = saveint(values[11],-1) o.job = saveint(values[12],-1) o.gender = saveint(values[13],-1) o.loc = saveint(values[14],-1) o.wlv = saveint(values[15]) o.elv = saveint(values[16]) o.view = saveint(values[17],-1) o.usescript = parsescript(values[18].replace('|',',')) o.equipscript = parsescript(values[19].replace('|',',')) objects.append(o) return objects # parsexmlitems(file) ## Creates a dictionary containing the values of a client items.xml ## Yeah, there are XML parsers in the standard python libraries, but they're too object ## oriented and thus don't fit the style of this program. def parsexmlitems(file): items = {} pre = "<item " term = "/>" attrs = ["id", "image", "art", "name", "description", "type", "weight", "slot"] intattrs = ["id", "art", "type", "weight", "slot"] s = file.read() index = 0 debug = 0 while pre in s[index:]: index += s[index:].find(pre) + len(pre) curitem = {} termstart = index + s[index:].find(term) + len(term) for attr in attrs: found = s[index:].find(attr+'="') if found >= 0: start = index + found + len(attr+'="') end= start + s[start:].find('"') else: start = termstart if start < termstart: curitem[attr] = s[start:end] for a in intattrs: try: if a in curitem: curitem[a] = int(curitem[a]) except: log.append("Item-ID %s: Cannot convert integer attribute %s to an integer. Value: '%s'" % (curitem["id"], a, curitem[a])) items[curitem['id']] = curitem return items # addclientinformation(items, citems) ## Entends the item data with the data collected from the client items.xml. Adding imageurls, ## client-name and -description def addclientinformation(items,citems): for i in items: if i.id in citems: i.imagename=citems[i.id]["image"] url=i.imagename[0].upper() + i.imagename[1:] i.imgurl = "[[Image:"+ url + "]]" imagesused.add( citems[i.id]["image"]) i.description = citems[i.id]["description"] i.clientname = citems[i.id]["name"] else: i.imgurl = '' i.description = '' i.clientname = '' # gettypedir (items) ## Returns sorted lists of items by itemtype def gettypedir(items): items.sort(key=lambda x: x.price+x.sell) typedir = whatever() typedir.healthy = [] typedir.status = [] typedir.inspiring = [] typedir.weapons = [] typedir.combos = [] typedir.armor = [] typedir.other = [] for item in items: if item.imgurl.strip() or item.clientname.strip(): #if item.id == 537: log.append('"%s", "%s"' % (item.imgurl, item.name) if item.atk > 0: if item.defense == 0: typedir.weapons.append(item) else: typedir.combos.append(item) elif item.defense > 0: typedir.armor.append(item) elif "itemheal" in item.usescript: if item.usescript["itemheal"][0] > item.usescript["itemheal"][1]: typedir.healthy.append(item) else: typedir.inspiring.append(item) elif "sc_start" in item.usescript: typedir.status.append(item) else: typedir.other.append(item) typedir.weapons.sort(key=lambda x: x.atk) typedir.armor.sort(key=lambda x: x.defense) typedir.combos.sort(key=lambda x: x.defense+x.atk) typedir.healthy.sort(key=lambda x: int(x.usescript["itemheal"][0])) typedir.inspiring.sort(key=lambda x: int(x.usescript["itemheal"][1])) #typedir.other.sort(key=lambda x: x.price+x.sell) typedir.status.sort(key=lambda x: x.price+x.sell) return typedir # printlog() ## Prints the global variable log to stdout def printlog(): global log if len(log) > 0: print '\n---------------------------------------' for line in log: print line # print<>items(items, title) ## Creates the table in wikicode, depending on what kind of item is being printed def getmoneystring(buy, sell): return '| align="right" | %d GP<br>%d gp\n' % (buy,sell) def getidstring(id): return '| align="center" | [%d]\n' % id def printhealitems(items,title): print '==%s==' % title print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' # Print labels for title in health_titles: print '! style="background:#efdead;" | %s' % title for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) print '| align="center" | %d' % i.usescript["itemheal"][0] print '| align="center" | %d' % i.usescript["itemheal"][1] sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| align="center!" | %d' % i.weight print '| %s' % i.description print '|}\n' def printstatusitems(items,title): print '==%s==\n' % title) print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n') # Print labels for title in status_titles: print '! style="background:#efdead;" | %s' % title for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) print '| align="center" | %s' % i.usescript["sc_start"][0] print '| align="center" | %s' % i.usescript["sc_start"][1] print '| align="center" | %s' % i.usescript["sc_start"][2] sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| align="center!" | %d' % i.weight print '| %s' % i.description print '|}\n' def printweaponitems(items, title): print '==%s==\n' % title) print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n') # Print labels for title in weapon_titles: print '! style="background:#efdead;" | %s\n' % title) for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) print '| align="center" | %d (%d)' % (i.atk,i.range) sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| align="center!" | %d' % i.weight print '| %s' % i.description print '|}\n' def printarmoritems(items, title): print '==%s==' % title print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' print '! style="background:#efdead;" | Image' print '! style="background:#efdead;" | Name' print '! style="background:#efdead;" | ID' print '! style="background:#efdead;" | Defense' print '! style="background:#efdead;" | Price<br>BUY/Sell' print '! style="background:#efdead;" | Description' for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) print '| align="center" | %d' % i.defense sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| %s' % i.description print '|}\n' def printcomboitems(items, title): print '==%s==' % title print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' print '! style="background:#efdead;" | Image' print '! style="background:#efdead;" | Name' print '! style="background:#efdead;" | ID' print '! style="background:#efdead;" | Damage<br>(Range)' print '! style="background:#efdead;" | Defense' print '! style="background:#efdead;" | Price<br>BUY/Sell' print '! style="background:#efdead;" | Description' for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) print '| align="center" | %d (%d)' % (i.atk,i.range) print '| align="center" | %d' % i.defense sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| %s' % i.description print '|}\n' def getpropertystring(item): s = "" s += "Weight: %d, " % item.weight s += "Slot: %d, " % item.slot s += "Job: %d, " % item.job s += "Gender: %d, " % item.gender s += "Loc: %d, " % item.loc s += "wLV: %d, " % item.wlv s += "eLV: %d, " % item.wlv s += "View: %d " % item.view return s def printotheritems(items, title): print '==%s==' % title print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' print '! style="background:#efdead;" | Image' print '! style="background:#efdead;" | Name' print '! style="background:#efdead;" | ID' #print '! style="background:#efdead;" | Type' #print '! style="background:#efdead;" | Properties' print '! style="background:#efdead;" | Price<br>BUY/Sell' print '! style="background:#efdead;" | Description' for i in items: print '|-' print '| align="center" | %s' % i.imgurl #print '| %s' % i.jname.replace('_',' ') print '| %s' % i.clientname sys.stdout.write( getidstring(i.id) ) #print '| align="center" | %d' % i.type #print '| align="center" | %s' % getpropertystring(i) sys.stdout.write( getmoneystring(i.price,i.sell) ) print '| %s' % i.description print '|}\n' def printunuseditems(title): ids = [] for i in range(1,len(imageurls)): if i not in imagesused: ids.append(i) if len(ids): print '==%s==' % title print '{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"' print '|', for i in ids: print imageurls[i], print '\n|}\n' ##################################################################### # MAIN ##################################################################### try: if len(sys.argv) == 1: item_db = "item_db.txt" item_xml = "items.xml" elif len(sys.argv) == 3: item_db = sys.argv[1] item_xml = sys.argv[2] else: item_db = '' item_xml = '' print "Wrong number of arguments" if item_db and not os.path.isfile(item_db): print "File does not exist: %s" % item_db item_db = '' if item_xml and not os.path.isfile(item_xml): print "File does not exist: %s" % item_xml item_db = '' if not (item_db and item_xml): print "\nUSAGE:" print "dbtowiki without any arguments will use item_db.txt and items.xml in the current directory." print "to specify custom files, call: dbtowiki <item_db> <item_xml>" exit(-1); else: log.append("Item-list [item_db] = %s" % item_db) log.append("Item-list [item_xml] = %s" % item_xml) f = open(item_db) items = parseitems(f); f = open(item_xml) citems = parsexmlitems(f); addclientinformation(items, citems) typedir = gettypedir(items) if len(typedir.healthy) > 0: printhealitems(typedir.healthy, "Health") if len(typedir.status) > 0: printstatusitems(typedir.status, "Status") if len(typedir.inspiring) > 0: printhealitems(typedir.inspiring, "Mana") if len(typedir.weapons) > 0: printweaponitems(typedir.weapons, "Weapons") if len(typedir.armor) > 0: printarmoritems(typedir.armor, "Armor") if len(typedir.combos) > 0: printcomboitems(typedir.combos, "Combos") if len(typedir.other) > 0: printotheritems(typedir.other, "Other") if checkimagesonwiki: print "Checking for images on wiki: " images = [] for item in typedir.healthy: images.append( (item.imagename, item.description)) for item in typedir.inspiring: images.append( (item.imagename, item.description)) for item in typedir.weapons: images.append( (item.imagename, item.description)) for item in typedir.armor: images.append( (item.imagename, item.description)) for item in typedir.combos: images.append( (item.imagename, item.description)) for item in typedir.other: images.append( (item.imagename, item.description)) need_to_upload=[] for imagename, description in images: fixedimagename = imagename[0].upper() + imagename[1:] curlstring='curl "http://wiki.themanaworld.org/index.php/' \ 'Image:%s"' % fixedimagename if debug: print "CHECKING URL: %s" % curlstring p=popen2.Popen4(curlstring) # this could hang if there is a lot of output! returncode = p.wait() # wait for the process to finish if debug: print "Process finished with %d" % returncode page = p.fromchild.read() if debug >= 3: print "Read: %s" % page if "No file by this name exists" in page: need_to_upload.append((imagename, description)) if debug: print "NEED TO UPLOAD: %s" % need_to_upload[-1] if len(need_to_upload): curlstring = 'curl -d "wpName=%s&wpPassword=%s&wpLoginattempt=Log+in" -c cookie-jar "http://wiki.themanaworld.org/index.php?title=Special:Userlogin&action=submitlogin&type=login"'% (wikiuser, wikipassword) print "Logging in as %s, your password can be seen " \ "in `ps ax`, also this is using http://... " \ "so be warned!" % wikiuser p=popen2.Popen4(curlstring) # this could hang if there is a lot of output! returncode = p.wait() # wait for the process to finish data = p.fromchild.read() if debug >= 1: print "Read: %s" % data if "Login error" in data: print "Login failed" if debug: print "Process finished with %d" % returncode sys.stdout.write("Now it is time to upload: %s" % need_to_upload) for imagename, description in need_to_upload: if debug: print "Uploading image: %s" % imagename curlstring='curl -b cookie-jar -F "wpUploadFile=@%s/%s" -F "filename=%s" -F "wpDestFile=%s" -F "wpUploadDescription=%s" -F "wpUpload=Upload file" "http://wiki.themanaworld.org/index.php?title=Special:Upload"' % (image_path, imagename, imagename, imagename, description) p=popen2.Popen4(curlstring) # this could hang if there is a lot of output! returncode = p.wait() # wait for the process to finish data = p.fromchild.read() if debug >= 1: print "Read: %s" % data if debug: print "Process finished with %d" % returncode print "Uploaded: %s, %s" % (imagename, description)) printunuseditems("Still unknown") print "\n" finally: printlog()