1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Errors abfangen Fehler beheben

    • misterspeed
    • 14. Mai 2014 um 19:52
    Zitat von AyKay

    Sorry,

    aber solche Beiträge kannst du dir auch sparen. Ich kann Scite nicht überall installieren.

    Es würde ja schon reichen wenn du das auf einem der Rechner machst, die diesen Fehler liefern. Alternativ kannst du auch etwas mehr debugging betreiben, z.B. in dem du bei jedem Funktionsaufruf und Funktionsende in eine Logdatei schreibst. Dadurch kannst du schonmal eingrenzen in welcher der Funktionen es zum Absturz des Scriptes kommt. Eventuell entsteht der Fehler auch in einem deiner Includes.

    Eine weitere Variante wäre es alle Includes (und deren Includes) plus Hauptscript händisch in einer einzigen au3 zusammenzukopieren, dann kannst du die Zeilenanzahl der Fehlermeldung beim kompilierten Script 1:1 nutzen. Das wäre jedenfalls bei dir noch recht leicht machbar und zur Not auch durch ein Script automatisierbar.

  • Remedy ODBC Abfrage funktioniert nicht

    • misterspeed
    • 13. Mai 2014 um 21:29

    Zu Remedy habe ich unter anderem das hier auf wikipedia gefunden:
    Quelle: http://de.wikipedia.org/wiki/BMC_Remed…_Request_System

    Zitat von wikipedia

    Das ARS nutzt eine Datenbank eines anderen Anbieters (DB2, Sybase, MS SQL, Oracle usw.), um darin Daten in Tabellen zu speichern.


    Evtl. handelt es sich bei dir ja um eine Oracle DB?

    Dazu würden jedenfalls diese Erklärungen passen:

    Oracle kennt anscheinend kein getdate(): http://stackoverflow.com/questions/1597…alid-identifier
    Oracle kennt anscheinend kein dateadd(): http://www.webdeveloper.com/forum/showthre…teAdd-in-oracle

  • Fenster mit sich ändernden Namen auf zweiten Monitor schieben

    • misterspeed
    • 13. Mai 2014 um 20:47

    Naja wie wärs mal mit Syntaxcheck in Scite bevor du deine Scripte ausführst? Das wird dir alle Fehler inklusive Zeilenangabe ausgeben. Zum Beispiel das hier:

    [autoit]

    If $aPos = 0[1] Then

    [/autoit]

    Keine Ahnung was du damit erreichen willst. Es ist sowohl syntaktisch falsch (außer 0 wäre ein Array), zum anderen ist $aPos entweder 0 (wenn das Fenster nicht gefunden wurde) oder ein Array. Am sichersten wäre die Prüfung mit

    [autoit]

    isarray()

    [/autoit]


    Nur wenn es ein Array ist hast du Koordinaten des Fensters und kannst $aPos als Array ansprechen. Da kommen wir zum nächsten Punkt.

    [autoit]

    wingetpos()

    [/autoit]


    liefert dir keine Infos darüber ob sich das Fenster auf dem primären oder sekundären Monitor befindet, sondern nur absolute Koordinaten des Fensters bezogen auf die gesamte Desktopfläche. Du musst also schon noch ein wenig mehr Aufwand betreiben um letzlich herauszufinden ob das Fenster woanderst hin soll oder nicht. Solltest du das zuverlässig hinbekommen haben rate ich dir dringendst davon ab mit

    [autoit]

    Send()

    [/autoit]

    zu arbeiten, da das viel zu unzuverlässig ist und ggf. mit Benutzereingaben kollidiert. Besser wäre in deinem Fall wohl die Nutzung von

    [autoit]

    winmove()

    [/autoit]
  • SQLite db auslesen

    • misterspeed
    • 11. Mai 2014 um 20:19
    Zitat von AspirinJunkie

    Wenn es Zahlen sind, welche eine ID darstellen (wahrscheinlich sogar auto increment) und in der Ausgabe mit 6 Stellen und führenden Nullen angezeigt werden sollen würde man es im Normalfall dennoch als Zahl speichern und bei einem Select die Ausgabe mit print() entsprechend dem gewünschten Format anpassen.

    Kommt drauf an was man erreichen will. Die führenden Nullen könnten auch Auswirkungen auf die spätere Sortierung der Daten haben. Hab das zwar nicht getestet, aber ein SORT BY nummer könnte bei einem nummerischen Datentyp zu solchen ungewollten Ausgaben führen (außer sqlite ist schlau genug in diesem Fall nummerisch zu sortieren):

    Code
    1
    101
    113
    2
    224
  • SQLite db auslesen

    • misterspeed
    • 11. Mai 2014 um 19:42
    Zitat von AspirinJunkie

    Auch wenn ich es eher unglücklich finde eine Zahl als String zu speichern.

    Ist in diesem Fall aber wohl notwendig, denn die führenden Nullen wären bei numerischen Datentypen so nicht möglich.

  • SQLite db auslesen

    • misterspeed
    • 11. Mai 2014 um 18:07

    Falls es tatsächlich Strings sein sollten müsstest du deinen Vergleich in der WHERE Klausel eben auf LIKE umstellen:


    SQL
    SELECT * From Tabelle WHERE Nummer LIKE '000002'
  • ComboBox manuelle Eingabe verhindern

    • misterspeed
    • 11. Mai 2014 um 09:30

    Poste bitte dein Script.

  • Verlassen einer UDF mit Return funktioniert nicht

    • misterspeed
    • 11. Mai 2014 um 09:21

    Naja wird sehr sicher an deiner Rekursion liegen. Sollte ein Ordner anstatt einer Datei gefunden werden ruft sich die Funktion selbst auf, ab hier hast du mindestens 2 verschachtelte Instanzen der Funktion laufen, ein Return der inneren Intanz springt wieder zurück zur nächst äußeren und nicht wie von dir erhofft zurück in den globalen Kontext deines Scriptes. Es erscheint also mindesten ein zweiter Treffer. Das ganze wird noch weiter verschachtelt wenn mehrere Unterverzeichnisse vorhanden sind. Wenn du also wirklich nach dem ersten "zu nutzenden" Treffer abbrechen willst empfhielt sich ein globales Flag, dass direkt nach dem rekursiven Aufruf zu einem Return führt.

    [autoit]


    global $abort = False
    $Path = Search(".exe","C:")
    MsgBox(0,"$Path",$Path)

    [/autoit][autoit][/autoit][autoit]

    Func Search($app,$Dir) ;ohne GUI
    ;...
    If StringInStr($FileAttributes,"D") Then ;ordner gefunden
    $ret = Search($app,$FullFilePath)
    if $abort = True then return $ret ; reicht den Return Wert der inneren Rekursionsstufe nach außen weiter
    Else ;datei gefunden
    if StringRight($FullFilePath,4) = ".exe" Then
    if StringInStr($FullFilePath, $app,2) <> 0 Then
    $use = MsgBox(3,"Objekt gefunden","Soll folgendes Objekt verwendet werden?"&@LF&$FullFilePath)
    Select
    case $use = "6"
    MsgBox(0,"OK",$FullFilePath)
    $abort = True
    Return $FullFilePath
    case $use = "2"
    MsgBox(0,"Abbruch","Suche durch den Benutzer abgebrochen")
    exit
    EndSelect
    ;...

    [/autoit]

    EDIT: Ahja und das Searchhandle sollte natürlich auch in jeder Rekursionsstufe geschlossen werden bevor du return verwendest, ansonsten hast du haufenweise handles die du nicht mehr nachträglich schließen kannst.

  • ComboBox manuelle Eingabe verhindern

    • misterspeed
    • 10. Mai 2014 um 20:34

    Verwende den Style

    [autoit]

    $CBS_DROPDOWNLIST

    [/autoit]
  • Denon Remote Protocol Telnet / TCPsend ?

    • misterspeed
    • 9. Mai 2014 um 19:51
    Zitat von Haldi

    Mir sind aber noch 2 dinge ein Dorn im Auge für dir mir gerade keine Lösung in den Sinn kommt.
    1. Gibt es eine möglichkeit das sich das Tray menue nicht schliesst nachdem man auf etwas geclickt hat ?
    2. Wie bringt ich das am besten rein das sich ein TrayItem automatisch aktualisiert sobal ich das tray menue öffne ? Wenn ich es in die While 1 schleiffe vor dem Switch einbaue gibt das doch nur ein riesen workload oder ?


    1. Glaube nicht, dass das geht.
    2. Auch das scheint nicht zu gehen. Grund ist, dass das Script pausiert sobald sich das Traymenü öffnet. Du müsstest also eher permanent in Intervallen den Text des Trayicons neu setzen lassen, sprich in deiner while Schleife in Verbindung mit einem angemessenen Timer, oder alternativ via adlibregister. So sollte der Status möglichst aktuell sein wenn du das Traymenü einblendest.

    Viel einfacher und sinnvoller wäre es meiner Meinung nach wenn du dich vom Traymenü verabschiedest und stattdessen eine GUI verwendest, welche oberhalb der Taskleiste eingeblendet wird wenn du aufs Icon klickst und ausgeblendet wird wenn du den "minimize to tray button" klickst. Das sollte beide Probleme lösen. Jenachdem wie lange die Statusabfrage dauert kannst du diese dann on demand (also bei klick aufs tray icon) oder aber wie oben vorgeschlagen doch eher permanent in Intervallen machen (z.B. wenn es mehrere Sekunden dauert, da sonst die GUI sehr lange nicht sichtbar wäre).

    EDIT:

    Ahja und warum baust du dein tcpconnect / tcpclose nicht am Scriptanfang bzw. Scriptende ein anstatt für jeden Befehl innerhalb der Funktion neu zu connecten? Das sollte die Performance ein wenig verbessern. Problematisch wäre das nur wenn der Server Verbindungen nach einer gewissen Zeit trennt, aber auch dem könnte man entgegenwirken, entweder durch regelmässigen Kontakt oder aber durch die Prüfung ob TCPsend erfolgreich war (falls nicht wird die Verbindung innerhalb der Funktion neu aufgebaut und erneut gesendet).

  • Einfaches Programm zum Zeilen Löschen

    • misterspeed
    • 8. Mai 2014 um 22:40

    Kann man so lassen ;)

    Zwei Anmerkungen hätte ich aber noch:


    • Autoit verwendet den Datentyp Variant. Du kannst dich also nicht unbedingt darauf verlassen, dass deine Strings die du in den Variablen hast auch wirklich immer als Zahl behandelt werden wenn du deine Division durchführst. Um die korrekte Interpretation zu erzwingen sollte man die Strings zur Sicherheit vorher "casten"
      [autoit]


      $Zahl = number($array[1]) / 10000
      $Zahl1 = number($array[2]) / 10000
      $Zahl2 = number($array[3]) / 10000

      [/autoit]
    • Aus Performancesicht wäre es vermutlich besser alle Teilergebnisse zu verketten und erst am Ende am Stück in die Zieldatei zu schreiben. Das ist zumindestens bei kleineren Datenmengen zu empfehlen. Bei mehreren 100 MB könnte dir aber der RAM ausgehen, daher sollte man in diesem Fall die Daten alle xx MB "schubweise" schreiben.
      [autoit]


      ;...
      local $ergebnis = ""
      while 1
      ;...
      ;FileWriteLine($hFileEdited, $Zahl&" "&$Zahl1&" "&$Zahl2&@CRLF&$Zahl&" "&$Zahl1&" 0")
      $ergebnis &= $Zahl&" "&$Zahl1&" "&$Zahl2&@CRLF&$Zahl&" "&$Zahl1&" 0" & @CRLF
      WEnd

      [/autoit] [autoit][/autoit] [autoit]

      FileWrite($hFileEdited, stringreplace($ergebnis,@CRLF,"",-1)) ; hier wird der letzte Zeilenumbruch noch vor dem Schreiben entfernt...

      [/autoit] [autoit][/autoit] [autoit]

      FileClose($hFile)
      FileClose($hFileEdited)

      [/autoit]
  • Einfaches Programm zum Zeilen Löschen

    • misterspeed
    • 7. Mai 2014 um 21:39
    Zitat von Carcharoth

    Edit: Habs selbst geschafft :rock:

    Glückwunsch. Wäre aber nett wenn du uns deine Lösung noch posten würdest, denn so haben andere hier im Forum zukünftig auch noch etwas von deinem Thread und wir können dir ggf. Schwachstellen an deine Lösung nennen oder Verbesserungsvorschläge einbringen.

  • Einfaches Programm zum Zeilen Löschen

    • misterspeed
    • 5. Mai 2014 um 20:22

    Als Student sollte man doch eigentlich in der Lage sein sich derart simple Dinge selbst in kürzester Zeit anzueignen, meinst du nicht? Wer macht den Rest deines Projektes? Datenaufbereitung und NC-Programmierung sind nunmal mit die Hauptaufgaben wenn es um 3D Druck geht. Du tust dir also nicht unbedingt einen gefallen damit wenn du das andere machen lässt.

    Hier als kleiner Denkanstoss die benötigten Funktionen um das gewünschte umzusetzen:

    [autoit]


    _filereadtoarray() ; sofern du inzwischen keine abartigen 400mb mehr hast, andernfalls siehe Lösungen oben zum Zeilenweise einlesen
    stringsplit
    stringright
    stringreplace
    _filewritefromarray()

    [/autoit]

    Ergänzend noch ne FOR Schleife zum Durchgehen des Arrays und das wars. Kann man auch als absoluter Anfänger innerhalb kürzester Zeit hinbekommen, insbesondere wenn man ein wenig was auf dem Kasten hat (was ich bei nem Student einfach mal vorraussetze).

  • Wo finde ich im Quelcode der URL "commerzbanking.de" die richtige Parameter für user und password?

    • misterspeed
    • 4. Mai 2014 um 17:06

    Wo ist das Problem?

    PHP
    ; Die ID des Loginforms:
    <form action="./login?0-1.IFormSubmitListener-loginForm&amp;page=/banking/landingpage/%3Fpk" method="post" id="id1">
    
    
    ; Hier die Daten für das Feld Anmeldename
    <input class="text-left required" type="text" required="required" id="teilnehmer" name="userid" autocomplete="off" maxlength="50" tabindex="1" autofocus="" data-h5-errorid="invalid-teilnehmer" value="" placeholder="Anmeldename/Teilnehmernummer" pattern="[0-9]{8}|[0-9]{10}|(?=(([0-9]+[^0-9]+)|([a-zA-Z]+[^a-zA-Z]+)|([@._\-]+[^@._\-]+)))[a-zA-Z0-9.@_\-]{8,50}"></input>
    
    
    ; Hier die Daten für das Feld PIN / Passwort
    <input type="password" class="text-left" required="required" id="pin" name="pin" autocomplete="off" maxlength="8" tabindex="2" data-h5-errorid="invalid-pin" value="" placeholder="PIN" pattern="[A-Za-z0-9]{5,8}"></input>
    
    
    ; Hier die Daten des Anmelde-Buttons
    <button class="b-01 b-a-04 b-g-01 login" type="submit" tabindex="4">Jetzt anmelden</button>
    Alles anzeigen

    Findet man in der Quellcodeansicht eines x-beliebigen Browsers wenn man nach Teilen des sichtbaren Textes oder der Infobeschreibung sucht. Noch einfacher findet man die Stellen im Quellcode natürlich mit entsprechenden Developer Plugins für den jeweiligen Browser, z.B. mit Firebug.

    Davon aber mal abgesehen würde ich mir wirklich sehr gut überlegen ob ich kritische Dinge wie meinen Bankzugang per Script automatisieren möchte/sollte. Automatisierung macht hier eigentlich nur Sinn wenn man die Zugangsdaten speichert und das würde ich keinesfalls tun. Du würdest damit sehr sicher auch gegen die AGB deiner Bank verstossen und zu 100% selbst haften wenn es durch deine Fahrlässigkeit zu Missbrauch kommt.

  • Pausieren eines Scriptes ?

    • misterspeed
    • 3. Mai 2014 um 18:27
    Zitat von Alf_H

    So einen Befehl hatte ich bei Autoit selbst gesucht und vermisst.

    Wie gesagt gibt bereits integrierte Funktionen für den Internetexplorer, dann spart man sich den Aufwand den man für Firefox betreiben muss und hat zudem eine Lösung die auf allen Windowsrechnern funktioniert, unabhängig davon ob Firefox und Mozrepl installiert sind.

    Zitat von Alf_H

    Mit _FFOpenUrl kann man das natürlich etwas eleganter lösen.

    Das wäre die entsprechende Funktion für den IE:

    [autoit]

    _IENavigate

    [/autoit]
  • Pausieren eines Scriptes ?

    • misterspeed
    • 3. Mai 2014 um 11:23
    Zitat von autoiter

    nur ergänzend zur Pause Funktion (habe das auch von hier), bzw, wie das ohne include machbar ist:

    Spoiler anzeigen

    HotkeySet("{PAUSE}","_pause")
    $pause=False
    ...
    ...
    ...

    Func _pause()
    $pause= Not $pause
    If Not $pause then Return
    Do
    Sleep(300)
    ToolTip('Das Script pausiert gerade', 0, 0); Kannst du freilich weglassen.
    Until not $pause
    EndFunc

    Alles anzeigen


    Eigentlich solltest du inzwischen ja wissen wie man hier Quellcode richtig postet...

    • [Blockierte Grafik: http://i.imgur.com/0Ad5mrS.png]
    • sinnvollerweise nur bei mehr als 20 Zeilen

    • Formatierten Autoit Quellcode zwischen den Autoit BBcodes einfügen
  • Pausieren eines Scriptes ?

    • misterspeed
    • 3. Mai 2014 um 10:11

    Wie wärs mal wenn du dein Script posten würdest?

    Mir ist nämlich absolut unklar, warum du Befehle wie send() benötigst und warum das Fenster von Firefox aktiv gehalten werden muss. Zum einen gibt es für die Firefox Automatisierung die ff.au3 und ein komplettes Unterforum dafür ( https://autoit.de/index.php?page=Board&amp;boardID=32 ), zum anderen liefert dir Autoit standardmässig bereits Funktionen für die Automatisierung des Internetexplorers. Beide Varianten erlauben dir nicht nur die Steuerung des jeweiligen Browsers (völlig egal ob dieser sichtbar, unsichtbar, im Vorder- oder Hintergrund ist), sie erlauben dir sogar das Browserfenster in deine eigene GUI einzubetten. Du brauchst auch nicht zwingend einen Hotkey um das Script zu pausieren, du könntest genauso gut einen Pausebutton einbauen, der z.B. eingeblendet wird wenn du deine Maus bewegst (vergleiche diverse Videoplayer oder Diashows).

    Nun zu deinen weiteren Fragen bezüglich der Pause Funktion von oben:

    Zitat

    Leider weiß ich nicht ganz, was das include macht, und was die DLL-Befehle ausführen.


    das Include "misc.au3" wird für die Funktion

    [autoit]

    _ispressed(...)

    [/autoit]

    benötigt. Wenn du dir die Hilfe dazu anschaust wirst du feststellen, dass die Funktion eine DLL (Standard user32.dll) benötigt. Wenn man diese nicht selbst per Handle übergibt wird diese bei jedem Funktionsaufruf geöffnet und geschlossen. Das kostet sehr viel Performanz, deswegen wird im Thread wo du diese Funktion gefunden hast die DLL einmalig geöffnet und an die Funktion übergeben. Im dortigen Thread fehlt aber ein Aufruf von

    [autoit]

    dllclose($dll)

    [/autoit]

    bei Programmende. Das sollte man nach Möglichkeit nicht vergessen. Wenn du genau wissen willst was die Funktion _ispressed() nun mit der DLL anstellt um magische Dinge wie Tastendrücke zu ermitteln schau in den Autoitincludeordner und bewundere die "misc.au3".


    Zitat

    Besonders die Variabelen _pause und _ispressed sind interessant. Naja, ich weiß halt gerne, was ich mache.
    Ich will ja auch was lernen.


    Da du was lernen willst:
    _pause() und _ispressed() sind keine Variablen sondern Funktionen. Was _ispressed() macht kannst du ja der Hilfe entnehmen. Was _pause() macht sollte bereits der Name offenbaren. Sie macht solange nichts ( sleep() ) bis eine bestimmte Taste gedrückt wird, danach gehts wieder dorthin wo die Funktion aufgerufen wurde.


    Zitat


    Bleibt noch die Frage, wie man das Fenster immer aktiv hält.
    Man weiß ja vorher nie, an welcher Stelle das Script irgendwann mal angehalten werden KÖNNTE.
    Anschließend soll das Fenster ja wieder aktiv sein.


    Siehe oben. Schau dir bitte die entsprechenden Funktionen zur Browserautomatisierung an. Ein Blick in die Hilfe zu folgenden Funktionen sollte deine Frage aber dennoch beantworten:

    [autoit]


    winactivate(...)
    winsetontop(...)

    [/autoit]
  • Erkennen von .au3 Files, welche nicht automatisch compiliert werden sollen

    • misterspeed
    • 2. Mai 2014 um 10:53
    Zitat von dost0011

    Mit #NoAutoIt3Execute kompiliert er das File trotzdem zu einem .exe (es lässt sich sogar ausführen).

    Ähm ja. Die PreCompiler Anweisung "#NoAutoIt3Execute" besagt ja auch nur, dass das zu kompilierende Script später nicht in der Lage ist selbst au3-Dateien auszuführen / zu interpretieren, was normalerweise über die Parameter "/AutoIt3ExecuteLine" oder "/AutoIt3ExecuteScript" mit jedem kompilierten Autoitscript möglich ist. Mehr dazu findest du in der Hilfe: http://translation.autoit.de/onlinehilfe/in…htm#CommandLine


    Zu deinem Problem:

    Ich verstehe den Sinn deines Scriptes zwar nicht, aber es würde wohl schon helfen wenn du deine Dateien vernünftig organisierst. Sprich alle au3 Dateien die nicht kompiliert werden sollen und folglich wohl nur als include in anderen au3 Dateien verwendet werden würde ich eben in einem Include Unterordner organisieren. Dein Script übergeht dann einfach alle au3 Dateien die sich in solch einem Unterordner befinden.

    Alternativ könntest du natürlich auch alle au3 Dateien eines Porjektes parsen und prüfen welche Datei bereits in anderen Dateien inkludiert wird und dementsprechend gewisse Dateien ausschließen.

  • Process von einem bestimmten Benutzer Beenden

    • misterspeed
    • 1. Mai 2014 um 20:57

    Nunja anstatt des Prozessnamens verwendest du mal besser die Prozess ID (PID) in deinem processclose() Aufruf, da diese eindeutig ist und nur einen Prozess identifiziert. Du musst nun nur noch rausfinden welcher der Firefox Prozesse zu welchem Benutzer gehört. Das kannst du über die PID und diese Funktion herausfinden:

    [autoit]


    Func _ProcessOwner($pid=0,$hostname=".")
    $objWMIService = ObjGet("winmgmts://" & $hostname & "/root/cimv2")
    $colProcess = $objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID ='" & $pid & "'")
    For $objProcess In $colProcess
    If $objProcess.ProcessID = $pid Then
    $usr = 0
    $objProcess.GetOwner($usr)
    Return $usr
    EndIf
    Next
    EndFunc

    [/autoit]

    EDIT:

    Aber davon mal ab solltest du eher das Problem lösen und nicht einfach nur den Browser töten. Ich tippe mal auf eine veraltete Version von Firefox, Flash oder irgendwelche seltsamen Add-Ons / Plugins.

  • Webcam Bild Automatisch speichern

    • misterspeed
    • 30. April 2014 um 19:55

    Dir ist schon klar, dass "snapshot.cgi" sehr sicher kein exotisches Bildformat, sondern ein serverseitiges Script ist, welches ein Bild erzeugt?

    Verwende inetread, lass dir den Quelltext der zurückgelieferten HTML Seite in die Scite console ausgeben und such dir den Bildlink raus, der sehr sicher auf dieser zurückgegebenen HTML Seite zu finden ist. Sofern dieses halb-manuelle Vorgehen zum Erfolg führt brauchst du eben noch diverse Stringfunktionen um den Link automatisiert aus dem Quelltext zu extrahieren um dann mit inetget das Bild herunterzuladen.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™