Hallo liebe Freunde des Droplogs,
ich werd hier mal die wichtigen Dateien die man zum erstellen eines Droplogs braucht "veröffentlichen", um das ganze zum Laufen zu bringen, benötigt man entweder sehr viel Geduld, oder ein paar Vorkenntnisse in Python und HTML und trotzdem noch eine gute Portion Geduld. Wenn man die aber hat, sollte es kein Problem sein hiermit selber einen Droplog zu erstellen (hoffe ich). Natürlich müsst ihr auch Python installiert haben (Version 2.x, nicht3.x, 3.x ist zwar die neuere aber weder mit dem Quellcode des Droplogs noch mit der GoogleAppEngine kompatibel).
Und damit geht es direkt los: Das Pythonscript des Droplogs selber ist darauf ausgerichtet mit Google's AppEngine zu laufen. Dafür benötigt man einen Google-Account, und muss sich da auch das entsprechende Programm (Google App Engine SDK for Python) herunterladen, mit dem man dann wiederum solche Scripte hochladen kann.
Wenn das Programm installiert ist, macht eine neue Applikation (STRG+N oder im Menü irgendwo), gebt einen Namen und ein Verzeichnis ein. In dieses Verzeichnis kopiert ihr dann folgende Dateien:
main.py
Außerdem ersetzen muss etwas in dieser Zeile:
Noch etwas zu ersetzen ist in Zeile 392: Hier kommt ein replace("ä","a") vor, dort das "ä" durch "&# 228" (ohne das Leerzeichen) ersetzen, danach sollte die Zeile folgendermaßen aussehn (wiederum ohne das Leerzeichen zwischen # und 2:
Und noch eine letzte Erestzung ist notwendig, öffnet diese Seite, macht Rechtsklick und geh auf Seitenquelltext anzeigen. Dann alles markieren, kopieren und den Teil der da drin steht an die Stelle ###Hier Codes.txt einfuegen!### (in main.py) einfügen (ungefähr Zeile 40).
Außerdem speichert ihr folgendes in cron.yaml mti einem Texteditor ab:
Das wars eigentlich schon, jetzt müsst ihr nur euch nur noch bei Google App Engine (hier) mit eurem Google-Account anmelden, eine Applikation erstellen (dort benötigt ihr den Namen den ihr beim Projekt erstellen eingegeben habt, der muss unter Application Identifier: angegeben werden). Dann das ganz hochladen und und die Links mit z.B. einem Frame in euer Forum einbinden.
Das hört sich alles nicht sehr einfach an, ist es auch nicht, wer es doch hinbekommt darf hier gerne ergänzen, vielleicht ergänze ich auch später nochmal mehr aber für heute reicht es. Auch Fragen sind hier natürlich erlaubt, wenn ihr etwas nicht hinbekommt.
Viele Grüße,
Marv
ich werd hier mal die wichtigen Dateien die man zum erstellen eines Droplogs braucht "veröffentlichen", um das ganze zum Laufen zu bringen, benötigt man entweder sehr viel Geduld, oder ein paar Vorkenntnisse in Python und HTML und trotzdem noch eine gute Portion Geduld. Wenn man die aber hat, sollte es kein Problem sein hiermit selber einen Droplog zu erstellen (hoffe ich). Natürlich müsst ihr auch Python installiert haben (Version 2.x, nicht
Und damit geht es direkt los: Das Pythonscript des Droplogs selber ist darauf ausgerichtet mit Google's AppEngine zu laufen. Dafür benötigt man einen Google-Account, und muss sich da auch das entsprechende Programm (Google App Engine SDK for Python) herunterladen, mit dem man dann wiederum solche Scripte hochladen kann.
Wenn das Programm installiert ist, macht eine neue Applikation (STRG+N oder im Menü irgendwo), gebt einen Namen und ein Verzeichnis ein. In dieses Verzeichnis kopiert ihr dann folgende Dateien:
main.py
- Code:
# -*- coding: cp1252 -*-
#Sicherheitscode: si2fha9238h
import cgi
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
import urllib2
import datetime
position = 0
last_positions = [0]
text=""
all1 = []
all1_orig = []
removed_1 = []
errors = 0
maxdays = 10
adding = ["High-Council","TD-Team","Technischer Admin","Member","Probemember"]
abenteuerlogbuch = "http://services.runescape.com/m=adventurers-log/l=1/rssfeed?searchName="
memberliste = "http://www.runehead.com/clans/ml.php?clan=darknezz"
mh1 = "http://services.runescape.com/m=itemdb_rs/l=1/results.ws?query=%22"
mh2 = "%22&price=all&members="
bild1 = "http://www.3gods.org/users/1314/82/00/73/album/"
bild2 = "10.png"
gedatabase = "http://services.runescape.com/m=itemdb_rs/l=1/viewitem.ws?obj="
bannerlink = "http://www.3gods.org/users/1314/82/00/73/album/c84elw10.png"
bannerlink2 = "http://www.3gods.org/users/1314/82/00/73/album/ocqev811.png"
showadds = False
spliteffigies = False
###Hier Codes.txt einfuegen!###
class Renew(webapp.RequestHandler):
def get(self,write = True):
global text
reset()
try:
reset()
f = urllib2.urlopen(memberliste)
text = f.read()
f.close()
except:
all1 = ['Spell_556', 'Lila_Steve', 'Neaera', 'Bruder_Jakob', 'Zitouna', 'Haha_Hero_P', 'Mac_3Gods', 'Soulalex1', 'Gallardo_16', 'Knedl_Knedl', 'Style_3Gods', 'Rage_3Gods', 'Lordvonjacko', 'Knusperk3ks', 'Ich_Wars_Ned', 'Marv_3Gods', 'Taschentuch9', 'Heinrichviii', 'Spider_3Gods', 'Bruder_0wn', 'Qwertz155', 'Wanabee_Tank', 'Noel_3Gods', 'Lila_Freddy', 'Rbn3c', 'Charly_Hark']
all1_orig = ['Spell_556', 'Lila_Steve', 'Neaera', 'Bruder_Jakob', 'Zitouna', 'Haha_Hero_P', 'Mac_3Gods', 'Soulalex1', 'Gallardo_16', 'Knedl_Knedl', 'Style_3Gods', 'Rage_3Gods', 'Lordvonjacko', 'Knusperk3ks', 'Ich_Wars_Ned', 'Marv_3Gods', 'Taschentuch9', 'Heinrichviii', 'Spider_3Gods', 'Bruder_0wn', 'Qwertz155', 'Wanabee_Tank', 'Noel_3Gods', 'Lila_Freddy', 'Rbn3c', 'Charly_Hark']
removed_1 = []
errors = 0
if write: self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">"+'Fehler!!!<br>')
if write: self.response.out.write(str(all1)+'<br>'+str(all1_orig)+'<br>'+str(removed_1)+'<br>'+str(errors)+'<br>')
if write: self.response.out.write("</span></body></html>")
return
endpos = _goto_("<!-- AD BANNER ROW-->")
reset(reset_text = False)
goto("Clan Signature: <a href=")
goto("'ranks'")
ranks = []
while len(ranks) < len(adding):
goto("a href")
if -1 in last_positions:
break
farbe = between_goto("style='","'")
if -1 in last_positions:
break
r = between_goto("title='Display Rank: ","'")
if -1 in last_positions:
break
ranks += Rank(r,farbe),
reset(reset_text = False)
goto("Total Members:")
stri = between_goto("/b> ","</li>")
total_members = int(stri)
reset(reset_text = False)
goto(" :: Memberlist")
goto("<tr class='subheader'>")
members = 0
while members < total_members:
goto("background-color:");
farbe = between_goto("; ","'")
goto("href='")
memb = between_goto("'>","<")
for r in ranks:
if r.farbe == farbe:
r.add(memb)
members+=1
adding_members = []
for r in ranks:
for m in r.members:
if r.name in adding:
adding_members += m.replace("3gods","3Gods"),
for m in adding_members:
m.replace("Heinrichviii","HeinrichVIII")
all1 = adding_members[:]
all1_orig = adding_members[:]
removed_1 = []
errors = 0
self.response.out.write("<!-- "+text.replace("-->","")+"\n")
for r in ranks:
self.response.out.write("\n\n"+str(r.name)+"\n"+str(r.farbe)+"\n"+str(r.members)+"\n")
self.response.out.write(" -->")
if write: self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
if write: self.response.out.write('<h2>Erfolgreich!</h2><br>')
if write: self.response.out.write(str(all1)+'<br>'+str(all1_orig)+'<br>'+str(removed_1)+'<br>'+str(errors)+'<br>')
if write: self.response.out.write("</span></body></html>")
q = db.GqlQuery("SELECT * FROM Save")
erg = q.fetch(10)
for e in erg:
e.delete()
save = Save()
save.list1 = str(all1)
save.list2 = str(removed_1)
save.list3 = str(all1_orig)
save.e = errors
save.put()
def replace_month(string):
return string.replace("Jan", "01").replace("Feb", "02").replace("Mar", "03").replace("Apr", "04").replace("Jul", "07").replace("Jun","06").replace("May","05").replace("Aug","08").replace("Sep","09").replace("Oct","10").replace("Nov","11").replace("Dec","12")
def goto(string):
global last_positions, position, text
last_positions += position,
position = text.find(string,position)+len(string)
return position
def _goto_(string):
global last_positions, position, text
last_positions += position,
position = text.find(string,position)+len(string)
p = position
position = last_positions[-1]
return p
def between_goto(string1,string2):
global last_positions, position, text
goto(string1)
goto(string2)
if (position == -1 or last_positions[-1] == -1):
return ""
return text[(last_positions[-1]):(position-len(string2))]
class Item(db.Model):
author = db.StringProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty()
class Skill2(db.Model):
author = db.StringProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty()
class Skill9():
author = db.StringProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty()
class Save(db.Model):
list1 = db.TextProperty()
list2 = db.TextProperty()
list3 = db.TextProperty()
e = db.IntegerProperty()
def reset(reset_text = True):
position = 0
last_positions = [0]
if reset_text:
text = ""
class Dropsitems(webapp.RequestHandler):
def get(self):
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:13\"><table border=\"0\" cellspacing=\"3\" cellpadding=\"1\">")
liste = d_items.keys()
liste.sort()
for l in liste:
self.response.out.write("<tr valign=\"middle\"><td align=\"right\">"+l+"</td><td align=\"left\">"+'<img src=\"'+bild1+d_items[l]+'\"'+' alt=\"'+l+'\" title=\"'+l+'\">'+"</td></tr>")
self.response.out.write("</table></span></body></html>")
class Drops(webapp.RequestHandler):
def get(self):
global spliteffigies
self.response.out.write("""<head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"></head>""")
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:13\">")
if showadds: self.response.out.write("<a href=\"http://www.3gods.org/\" target=\"_blank\"><img src=\""+bannerlink+"\" alt=\"Clan of the 3 Gods\" title=\"Clan of the 3 Gods\"></a>")
query = db.GqlQuery('SELECT * FROM Item ORDER BY date DESC')
items = query.fetch(100)
maxdays = 14
ausgaben = []
tage = []
dates = []
for item in items:
if not(item.date in dates) and ((str(item.content) != "eine uralte Skulptur") or not(spliteffigies)):
if (datetime.datetime.today() - item.date < datetime.timedelta(days = maxdays)):
dates += item.date,
d = str(item.date)
tag = 'am '+d[8:10]+'.'+d[5:7]
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 48)):
tag = 'gestern'
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 24)):
tag = 'heute'
ausgaben += [],
tage += tag,
else:
break
nummer = 0
for date in dates:
spieler = []
self.response.out.write('<div align="center">'+"<span style=\"font-family:Verdana; font-size:14; text-decoration:underline; font-style:bold\">"+tage[nummer]+"</span></div><div align=\"center\"><table border=\"0\" cellspacing=\"3\" cellpadding=\"1\">")
for item in items:
if item.date == date and ((str(item.content) != "eine uralte Skulptur") or not(spliteffigies)):
heis = str(item.content).replace("ein Paar ","").replace("einen ","").replace("eine ","").replace("ein ","")
suchtag = heis [:]
suchtag.replace("ü","ü").replace("ö","ö").replace("ä","ä")
try:
bild_pfad = d_items[heis]
t1 = '<span style=\"font-family:Verdana; font-weight:bold; font-size:18\"> 999 </span>'
if str(item.content) != "eine uralte Skulptur": t1 += '<a href="'+gedatabase+d_ids[suchtag]+'" target="_blank">'
t1 += '<img src=\"'+bild1+bild_pfad+'\"'+' alt=\"'+heis+'\" title=\"'+heis+'\" border=\"0\">'
if str(item.content) != "eine uralte Skulptur": t1 += '</a>'
except:
t1 = '<span style=\"font-family:Verdana; font-weight:bold; font-size:12\"> 999 '
t1 += heis+'</span>'
if item.author in spieler:
ausgaben[nummer][spieler.index(item.author)] += t1,
else:
spieler += item.author,
ausgaben[nummer] += [],
ausgaben[nummer][spieler.index(item.author)] += t1,
notagain = []
for s in spieler:
self.response.out.write('<tr valign=\"middle\"><td align=\"right\">'+"<span style=\"font-family:Verdana; font-size:11; font-style:italic\">"+s+':</span></td><td align=\"left\">')
for a in ausgaben[nummer][spieler.index(s)]:
zahl = ausgaben[nummer][spieler.index(s)].count(a)
if zahl == 1:
self.response.out.write(a.replace("999",""))
elif not (a in notagain):
self.response.out.write(a.replace("999",str(zahl)+'x '))
notagain += a,
self.response.out.write('</td></tr></div>')
nummer += 1
self.response.out.write('</div></table>')
self.response.out.write("""
<a href="/drops/all" target="_blank">Mehr Drops anzeigen</a></span>
</body>
</html>""")
class Skill2s(webapp.RequestHandler):
def get(self,limited = True):
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
if showadds: self.response.out.write("<a href=\"http://www.3gods.org/\" target=\"_blank\"><img src=\""+bannerlink2+"\" alt=\"Clan of the 3 Gods\" title=\"Clan of the 3 Gods\"></a>")
query = db.GqlQuery("SELECT * FROM Skill2 ORDER BY date DESC LIMIT 100")
s = query.fetch(200)
maxdays = 3
skills = s[:]
ausgaben = []
ausgaben2 = []
tage = []
dates = []
for item in skills:
item.anzeige = True
item.langerskill = False
if not(item.date in dates):
if (datetime.datetime.today() - item.date < datetime.timedelta(days = maxdays)):
dates += item.date,
d = str(item.date)
tag = 'am '+d[8:10]+'.'+d[5:7]
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 48)):
tag = 'gestern'
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 24)):
tag = 'heute'
ausgaben += [],
ausgaben2 += [],
tage += tag,
else:
break
nummer = 0
for date in dates:
self.response.out.write('<div align="center">'+"<span style=\"font-family:Verdana; font-size:14; text-decoration:underline; font-style:bold\">"+tage[nummer]+"</span><br>"+"<table border=\"0\" cellspacing=\"4\" cellpadding=\"1\">"+'</div>')
spieler = []
lvls = []
for item in skills:
if item.date == date:
if not(str(item.content)[-2:] in lvls):
lvls += str(item.content)[-2:],
if item.author in spieler:
ausgaben[nummer][spieler.index(item.author)] += item.content,
else:
spieler += item.author,
ausgaben[nummer] += [],
ausgaben2[nummer] += [],
ausgaben[nummer][spieler.index(item.author)] += item.content,
for s in spieler:
notagain = []
for a in ausgaben[nummer][spieler.index(s)]:
temp = []
if not(a[:7] in notagain):
for a2 in ausgaben[nummer][spieler.index(s)]:
if a[:7] == a2[:7]:
temp += int(a2[-2:]),
if len(temp) > 1:
temp.sort()
ausgaben2[nummer][spieler.index(s)] += (a[:-2] + str(temp[0]) +'-'+ str(temp[-1])),
notagain += a[:7],
else:
ausgaben2[nummer][spieler.index(s)] += a,
lvls.sort()
lvls.reverse()
for l in lvls:
for s in spieler:
for a in ausgaben2[nummer][spieler.index(s)]:
if l == a[-2:]:
t1 = "<tr valign=\"middle\"><td align=\"right\"><span style=\"font-family:Verdana; font-size:12; font-style:italic\">"+str(s)+'</span></td><td align="center">'
t1 += '<img src="'+bild1+str(a).replace("ä","a")[:6].replace(" ","").lower()+bild2+'" alt="'
t1 += str(a)+'\" title=\"'+str(a).split(" ")[0]+'\">'+'</td><td><span style=\"font-family:Verdana; font-weight:bold; font-size:16\">'
t1 += str(a).split(" ")[-1]+'</span></td></tr>'
self.response.out.write(t1)
self.response.out.write("</table>")
nummer += 1
self.response.out.write("""
<a href="/skills/all" target="_blank">Mehr Skills anzeigen</a></span>
</body>
</html>""")
class Info(webapp.RequestHandler):
def get(self):
q = db.GqlQuery("SELECT * FROM Save")
erg = q.fetch(1)
all1 = eval(erg[0].list1)
removed_1 = eval(erg[0].list2)
all1_orig = eval(erg[0].list3)
errors = int(erg[0].e)
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
self.response.out.write("<h2>Momentan erfasste Member:</h2><br>")
all1_orig.sort()
removed_1.sort()
for m in all1_orig:
if not(m in removed_1):
self.response.out.write(m+'<br>')
self.response.out.write("<br><br><h2>Entfernte Member:</h2><br>")
for r in removed_1:
self.response.out.write(r+'<br>')
self.response.out.write("</span></body></html>")
class Info2(webapp.RequestHandler):
def get(self):
q = db.GqlQuery("SELECT * FROM Save")
erg = q.fetch(1)
all1 = eval(erg[0].list1)
removed_1 = eval(erg[0].list2)
all1_orig = eval(erg[0].list3)
errors = int(erg[0].e)
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
if showadds: self.response.out.write("<a href=\"http://www.3gods.org/\" target=\"_blank\"><img src=\""+bannerlink+"\" alt=\"Clan of the 3 Gods\" title=\"Clan of the 3 Gods\"></a>")
self.response.out.write("<h2>Momentan erfasste Member:</h2><br>")
for m in all1_orig:
if not(m in removed_1):
self.response.out.write(m+'<br>')
self.response.out.write("<br><br><h2>Entfernte Member:</h2><br>")
for r in removed_1:
self.response.out.write(r+'<br>')
self.response.out.write("<br><br>---------------------------------<br><br>Fehlerzyklus: "+str(errors))
self.response.out.write("<h2>In diesem Zyklus noch zu untersuchende Member:</h2><br>")
for m in all1:
self.response.out.write(m+'<br>')
self.response.out.write("</span></body></html>")
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
self.response.out.write("""
</span>
</body>
</html>""")
class Update(webapp.RequestHandler):
def get(self):
global text
q = db.GqlQuery("SELECT * FROM Save")
erg = q.fetch(1)
try:
all1 = eval(erg[0].list1)
removed_1 = eval(erg[0].list2)
all1_orig = eval(erg[0].list3)
errors = int(erg[0].e)
except:
r = Renew()
r.get(write = False)
return
self.response.out.write('<html><body>')
remove = []
take_now = all1[:2]
self.response.out.write(str(take_now )+"<br>")
if errors == 6:
errors = 0
removed_1 += take_now
for r in take_now:
all1.remove(r)
if len(take_now) == 0:
all1 = all1_orig[:]
errors = 0
for r in removed_1:
all1.remove(r)
tmp_errors = 0
for m in take_now:
text = ""
try:
reset()
f = urllib2.urlopen(abenteuerlogbuch+m)
text += f.read()
f.close()
self.response.out.write("Keine Probleme: "+str(m)+"<br>")
remove += m,
except:
self.response.out.write("Error: "+str(m)+"<br>")
text = ""
tmp_errors += 1
goto("image")
if text != "":
q = db.GqlQuery("SELECT * FROM Item")
results = q.fetch(900)
self.response.out.write('<br>In Datenbank: '+str(len(results))+'<br>')
for result in results:
if result.author == m:
self.response.out.write(result.content+" "+m+" deleted<br>")
result.delete()
for i in range (0,12):
x1 = between_goto("Gegenstand gefunden: ",".</title>")
x2 = between_goto("<pubDate>","</pubDate>")
if x1 == "" or x2 == "":
break
k = x2.replace(" ","-")
k = k[5:16]+' '+k[17:-4]
x2 = replace_month(k)
item = Item()
if len(x1)+len(m)+len(str()) > 50:
break
item.content = x1
item.author = m
item.date = datetime.datetime(int(x2[6:10]), int(x2[3:5]), int(x2[0:2]),0,0,0,0)
item.put()
self.response.out.write(str(x1)+" "+str(x2)+" gefunden von "+str(m)+" <br>")
reset();goto("image")
if text != "":
q = db.GqlQuery("SELECT * FROM Skill2")
results = q.fetch(900)
self.response.out.write('<br>In Datenbank: '+str(len(results))+'<br>')
for result in results:
if result.author == m:
self.response.out.write(result.content+" "+m+" deleted<br>")
result.delete()
notagain = []
for i in range (0,12):
goto("aufgestiegen.</title>")
x1 = between_goto("Ich habe "," trainiert.")
x2 = between_goto("<pubDate>","</pubDate>")
if x1 == "" or x2 == "":
break
k = x2.replace(" ","-")
k = k[5:16]+' '+k[17:-4]
x2 = replace_month(k)
if (x1+x2) in notagain:
break
skill = Skill2()
if len(x1)+len(m)+len(str()) > 50:
break
skill.content = x1
skill.author = m
try:
skill.date = datetime.datetime(int(x2[6:10]), int(x2[3:5]), int(x2[0:2]),0,0,0,0)
except:
break
skill.put()
notagain += (x1+x2),
self.response.out.write("Skill2: "+str(x1)+" "+str(x2)+" gefunden von "+str(m)+" <br>")
if len(take_now) == tmp_errors:
errors += 1
else:
errors = 0
self.response.out.write("<br>Updated!</body></html>")
for r in remove:
all1.remove(r)
q = db.GqlQuery("SELECT * FROM Save")
erg = q.fetch(10)
for e in erg:
e.delete()
save = Save()
save.list1 = str(all1)
save.list2 = str(removed_1)
save.list3 = str(all1_orig)
save.e = errors
save.put()
class Renew_Datastore(webapp.RequestHandler):
def get(self):
q = db.GqlQuery("SELECT * FROM Skill2")
results = q.fetch(1000)
self.response.out.write(str(len(results))+" deleted!<br>")
for result in results:
result.delete()
q = db.GqlQuery("SELECT * FROM Item")
results = q.fetch(1000)
self.response.out.write(str(len(results))+" deleted!")
for result in results:
result.delete()
class Rank():
def __init__(self,name,farbe):
self.name = name
self.farbe = farbe
self.members = []
def add(self,member):
self.members += member,
###########################################################################################################
class Skill2s2(webapp.RequestHandler):
def get(self):
global spliteffigies
limited = False
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:11\">")
if showadds: self.response.out.write("<a href=\"http://www.3gods.org/\" target=\"_blank\"><img src=\""+bannerlink+"\" alt=\"Clan of the 3 Gods\" title=\"Clan of the 3 Gods\"></a>")
query = db.GqlQuery("SELECT * FROM Skill2 ORDER BY date DESC LIMIT 100")
s = query.fetch(400)
maxdays = 120
skills = s[:]
ausgaben = []
ausgaben2 = []
tage = []
dates = []
for item in skills:
item.anzeige = True
item.langerskill = False
if not(item.date in dates):
if (datetime.datetime.today() - item.date < datetime.timedelta(days = maxdays)):
dates += item.date,
d = str(item.date)
tag = 'am '+d[8:10]+'.'+d[5:7]
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 48)):
tag = 'gestern'
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 24)):
tag = 'heute'
ausgaben += [],
ausgaben2 += [],
tage += tag,
else:
break
nummer = 0
for date in dates:
self.response.out.write('<div align="center">'+"<span style=\"font-family:Verdana; font-size:14; text-decoration:underline; font-style:bold\">"+tage[nummer]+"</span><br>"+"<table border=\"0\" cellspacing=\"4\" cellpadding=\"1\">"+'</div>')
spieler = []
lvls = []
for item in skills:
if item.date == date:
if not(str(item.content)[-2:] in lvls):
lvls += str(item.content)[-2:],
if item.author in spieler:
ausgaben[nummer][spieler.index(item.author)] += item.content,
else:
spieler += item.author,
ausgaben[nummer] += [],
ausgaben2[nummer] += [],
ausgaben[nummer][spieler.index(item.author)] += item.content,
for s in spieler:
notagain = []
for a in ausgaben[nummer][spieler.index(s)]:
temp = []
if not(a[:7] in notagain):
for a2 in ausgaben[nummer][spieler.index(s)]:
if a[:7] == a2[:7]:
temp += int(a2[-2:]),
if len(temp) > 1:
temp.sort()
ausgaben2[nummer][spieler.index(s)] += (a[:-2] + str(temp[0]) +'-'+ str(temp[-1])),
notagain += a[:7],
else:
ausgaben2[nummer][spieler.index(s)] += a,
lvls.sort()
lvls.reverse()
for l in lvls:
for s in spieler:
for a in ausgaben2[nummer][spieler.index(s)]:
if l == a[-2:]:
t1 = "<tr valign=\"middle\"><td align=\"right\"><span style=\"font-family:Verdana; font-size:12; font-style:italic\">"+str(s)+'</span></td><td align="center">'
t1 += '<img src="'+bild1+str(a).replace("ä","a")[:6].replace(" ","").lower()+bild2+'" alt="'
t1 += str(a)+'\" title=\"'+str(a).split(" ")[0]+'\">'+'</td><td><span style=\"font-family:Verdana; font-weight:bold; font-size:16\">'
t1 += str(a).split(" ")[-1]+'</span></td></tr>'
self.response.out.write(t1)
self.response.out.write("</table>")
nummer += 1
self.response.out.write("""
</span>
</body>
</html>""")
###########################################################################################################
class Drops2(webapp.RequestHandler):
def get(self):
global spliteffigies
self.response.out.write("<html><body>"+"<span style=\"font-family:Verdana; font-size:13\">")
if showadds: self.response.out.write("<a href=\"http://www.3gods.org/\" target=\"_blank\"><img src=\""+bannerlink+"\" alt=\"Clan of the 3 Gods\" title=\"Clan of the 3 Gods\"></a>")
query = db.GqlQuery('SELECT * FROM Item ORDER BY date DESC')
items = query.fetch(100)
maxdays = 120
ausgaben = []
tage = []
dates = []
for item in items:
if not(item.date in dates) and ((str(item.content) != "eine uralte Skulptur") or not(spliteffigies)):
if (datetime.datetime.today() - item.date < datetime.timedelta(days = maxdays)):
dates += item.date,
d = str(item.date)
tag = 'am '+d[8:10]+'.'+d[5:7]
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 48)):
tag = 'gestern'
if (datetime.datetime.today() - item.date < datetime.timedelta(hours = 24)):
tag = 'heute'
ausgaben += [],
tage += tag,
else:
break
nummer = 0
for date in dates:
spieler = []
self.response.out.write('<div align="center">'+"<span style=\"font-family:Verdana; font-size:14; text-decoration:underline; font-style:bold\">"+tage[nummer]+"</span></div><div align=\"center\"><table border=\"0\" cellspacing=\"3\" cellpadding=\"1\">")
for item in items:
if item.date == date and ((str(item.content) != "eine uralte Skulptur") or not(spliteffigies)):
heis = str(item.content).replace("ein Paar ","").replace("einen ","").replace("eine ","").replace("ein ","")
try:
bild_pfad = d_items[heis]
t1 = '<span style=\"font-family:Verdana; font-weight:bold; font-size:18\"> 999 </span>'+'<img src=\"'+bild1+bild_pfad+'\"'+' alt=\"'+heis+'\" title=\"'+heis+'\">'
except:
t1 = '<span style=\"font-family:Verdana; font-weight:bold; font-size:12\"> 999 '
t1 += heis+'</span>'
if item.author in spieler:
ausgaben[nummer][spieler.index(item.author)] += t1,
else:
spieler += item.author,
ausgaben[nummer] += [],
ausgaben[nummer][spieler.index(item.author)] += t1,
notagain = []
for s in spieler:
self.response.out.write('<tr valign=\"middle\"><td align=\"right\">'+"<span style=\"font-family:Verdana; font-size:11; font-style:italic\">"+s+':</span></td><td align=\"left\">')
for a in ausgaben[nummer][spieler.index(s)]:
zahl = ausgaben[nummer][spieler.index(s)].count(a)
if zahl == 1:
self.response.out.write(a.replace("999",""))
elif not (a in notagain):
self.response.out.write(a.replace("999",str(zahl)+'x '))
notagain += a,
self.response.out.write('</td></tr></div>')
nummer += 1
self.response.out.write('</div></table>')
self.response.out.write("""
</span>
</body>
</html>""")
######################################################################################################
application = webapp.WSGIApplication(
[('/', MainPage),
('/drops', Drops),
('/drops/items', Dropsitems),
('/skills', Skill2s),
('/drops/all', Drops2),
('/skills/all', Skill2s2),
('/update/si2fha9238h', Update),
('/info', Info),
('/info/si2fha9238h', Info2),
('/renew/si2fha9238h', Renew),
('/renew_datastore/si2fha9238h', Renew_Datastore)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Außerdem ersetzen muss etwas in dieser Zeile:
Hier müssen die Ränge eurer Memberliste eingetragen werden, die im Droplog erscheinen sollen, wie sie auf der RuneHead-Seite lauten. Also Wenn ihr z.B. keinen Rang habt der TD-Team oder High-Council heißt, aber z.B. einen Leader Rang und nicht wollt, dass eure Probemember in dem Droplog auftauchen dann wäre das eure neue Zeile:adding = ["High-Council","TD-Team","Technischer Admin","Member","Probemember"]
adding = ["Leader","Technischer Admin","Member"]
Noch etwas zu ersetzen ist in Zeile 392: Hier kommt ein replace("ä","a") vor, dort das "ä" durch "&# 228" (ohne das Leerzeichen) ersetzen, danach sollte die Zeile folgendermaßen aussehn (wiederum ohne das Leerzeichen zwischen # und 2:
- Code:
t1 += '<img src="'+bild1+str(a).replace("&# 228;","a")[:6].replace(" ","").lower()+bild2+'" alt="'
Und noch eine letzte Erestzung ist notwendig, öffnet diese Seite, macht Rechtsklick und geh auf Seitenquelltext anzeigen. Dann alles markieren, kopieren und den Teil der da drin steht an die Stelle ###Hier Codes.txt einfuegen!### (in main.py) einfügen (ungefähr Zeile 40).
Außerdem speichert ihr folgendes in cron.yaml mti einem Texteditor ab:
- Code:
cron:
- description: autoupdate
url: /update/###Sicherheitscode###
schedule: every 1 minutes
- description: memberlisteupdate
url: /renew/###Sicherheitscode###
schedule: every day 02:00
Das wars eigentlich schon, jetzt müsst ihr nur euch nur noch bei Google App Engine (hier) mit eurem Google-Account anmelden, eine Applikation erstellen (dort benötigt ihr den Namen den ihr beim Projekt erstellen eingegeben habt, der muss unter Application Identifier: angegeben werden). Dann das ganz hochladen und und die Links mit z.B. einem Frame in euer Forum einbinden.
Das hört sich alles nicht sehr einfach an, ist es auch nicht, wer es doch hinbekommt darf hier gerne ergänzen, vielleicht ergänze ich auch später nochmal mehr aber für heute reicht es. Auch Fragen sind hier natürlich erlaubt, wenn ihr etwas nicht hinbekommt.
Viele Grüße,
Marv
Zuletzt von Marv am 14.07.11 11:17 bearbeitet; insgesamt 10-mal bearbeitet