[utils.miner] Added achievement mining

This commit is contained in:
Felipe Martín 2013-06-03 16:51:36 +02:00
parent d89bd44f8b
commit cb025ee214
4 changed files with 154 additions and 3 deletions

124
utils/miner/achievements.py Normal file
View File

@ -0,0 +1,124 @@
#!/usr/bin/env python
# General libs
import re
import json
import os
import sys
# Tool libs
from utils import run, sanitize
import utils
import conf
from objects import GameAchievement
utils.title('ACHIEVEMENTS')
if conf.SAVE:
sys.path.append('../../minecraftcodex')
os.environ['DJANGO_SETTINGS_MODULE'] = 'local_settings'
from database.models import Achievement
###
# GLOBALS
###
ITEMS = []
###
# LOOK FOR CORRECT JAVA FILES
###
utils.sub("Looking for java files...")
#utils.sub("Keywords: %s" % ', '.join(conf.ACHIEVEMENTS_JAVA_KEYWORDS))
for keyword in conf.ACHIEVEMENTS_JAVA_KEYWORDS:
cmd = run('grep \'%s\' ./classes/*' % keyword)
for result in cmd:
if result and result is not '':
java_file = os.path.basename(result.strip().split()[0][:-1])
if java_file not in conf.ACHIEVEMENTS_FILES:
utils.echo("%s " % java_file, end='')
conf.ACHIEVEMENTS_FILES.append(java_file)
utils.echo('\r')
###
# GET ITEMS INFO FROM CLASSFILE
###
utils.sub('Looking for dataz', end='\n')
# Old items for final count
try:
OLD_ITEMS = json.loads(open('achievements.json').read())
except:
OLD_ITEMS = {}
OLD_ITEMS['list'] = []
for java_file in conf.ACHIEVEMENTS_FILES:
file_handler = open('./classes/%s' % java_file)
data = file_handler.read().split("\n")
item_regex = re.compile(conf.ACHIEVEMENTS_PATTERN)
class_error_regex = re.compile('name \'(?P<name>\w+)\' is not defined')
for line in data:
if '"' in line:
t = item_regex.search(line)
if t:
item = t.groupdict()
if conf.DEBUG:
print("Line: " + item['code'])
item['code'] = sanitize(item['code'])
if conf.DEBUG:
print("Sanitize: " + item['code'])
try:
obj = eval(item['code'])
except NameError as error:
# Create class for the given classname
class_name = class_error_regex.search(error.__str__()).group('name')
if conf.DEBUG:
print("Classname: %s" % class_name)
setattr(sys.modules[__name__], class_name, type(class_name, (GameAchievement,), {}))
obj = eval(item['code'])
#if obj.name == 'appleGold':
if conf.DEBUG:
print("result object: " + obj.__str__())
print('- - - - - -')
ITEMS.append(obj)
if conf.SAVE:
for item in ITEMS:
try:
obj = Achievement.objects.get(
internal_name=item.name,
internal_id=item.id
)
except Achievement.DoesNotExist:
obj = Achievement(
internal_name=item.name,
internal_id=item.id
)
obj.save()
# Print the miner summary and compile the new old data
new_old_data = {}
new_old_data['list'] = []
[new_old_data['list'].append(x.name) for x in ITEMS]
new_items = len(new_old_data['list'])-len(OLD_ITEMS['list'])
utils.info('Found %d achievements (%d new)' % (len(new_old_data['list']), new_items))
if new_items != 0:
utils.sub('Modifications:', end='\n')
for item in ITEMS:
if item.name not in OLD_ITEMS['list']:
utils.sub(' + %s' % item.name, end='\n', color=utils.colors.GREEN)
for item in OLD_ITEMS['list']:
if item not in new_old_data['list']:
utils.sub(' - %s' % item, end='\n', color=utils.colors.RED)
olditems = open('achievements.json', 'w')
olditems.write(json.dumps(new_old_data))

View File

@ -12,7 +12,6 @@ TEXTURES_EXTRA_SIZES_MULTIPLIER = [2, 4, 6, 8]
###
# ITEMS
###
ITEMS_FILES = []
ITEMS_JAVA_KEYWORDS = ['flintAndSteel', 'axeStone', 'swordDiamond']
ITEMS_PATTERN = "new (?P<code>[a-z]{2}\((?P<id>[1-9]{1,3}).*\"(?P<name>\w+)\"\))"
@ -20,7 +19,6 @@ ITEMS_PATTERN = "new (?P<code>[a-z]{2}\((?P<id>[1-9]{1,3}).*\"(?P<name>\w+)\"\))
###
# BLOCKS
###
BLOCKS_FILES = []
BLOCKS_JAVA_KEYWORDS = ['stonebrick']
BLOCKS_PATTERN = "new (?P<code>[a-z]{1,3}\((?P<id>[1-9]{1,3}).*\"(?P<name>\w+)\"\))"
@ -36,10 +34,17 @@ LANGUAGES_MASTER_KEYS = [
]
###
# ACHIEVEMENTS
###
ACHIEVEMENTS_FILES = []
ACHIEVEMENTS_JAVA_KEYWORDS = ['onARail', 'flyPig']
ACHIEVEMENTS_PATTERN = "new (?P<code>[a-z]{1,2}\((?P<id>[1-9]{1,3})\, \"(?P<name>\w+)\".*\))"
###
# BLACKLIST
###
CLASS_BLACKLIST = [
'and', 'abs', 'all', 'any', 'bin', 'chr'
]

View File

@ -80,3 +80,23 @@ class GameLanguage(object):
def add_string(self, key, value):
if key not in self.strings:
self.strings[key] = value
###
# ACHIEVEMENTS
###
class GameAchievement(object):
def __init__(self, internal_id, name, *args):
self.id = int(internal_id)
self.name = name
def method(self, *args):
return self
def __getattr__(self, *args):
return self.method
def __str__(self):
return "<Achievement (%d: '%s')>" % (
self.id,
self.name
)

View File

@ -9,3 +9,5 @@ python items.py
python blocks.py
python languages.py
python achievements.py