Natenoms Wiki

Weil Teilen Spaß macht :)

Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Übersetzungen dieser Seite:

Navigation



Lizenz dieses Wikis
Über dieses Wiki
Feed des Wikis
Impressum


Was gerade in meinem Blog geschieht:

linux:scripte:moc:jabberbot

Ein Bot um über Jabber Moc steuern zu können

Die Hauptarbeit und die Logik stammen von Hubert Chathi und Thomas Perl (siehe unten), die ihre Arbeit frei verfügbar gemacht haben. Ich habe nur die Funktionen zum Status des Systems entfernt und durch Steuerdinge für MusicOnConsole (moc) ersetzt. Mehr nicht :P

Jeder der den Musicbot steuern möchte, muss nur den entsprechenden Account in seine Kontakte aufnehmen.

Zugangsdaten des Jabberaccounts

Damit der Bot funktioniert, erstellt man im selben Verzeichnis oder in /etc/ eine Datei (systembot.cfg) mit dem Inhalt:

[systembot]
username = xxxxxxbot@jabber.ccc.de
password = gutestollespasswort

Abhängigkeiten

Man braucht noch den eigentlichen Jabberbot, die Komponente, die sich zu Jabber verbindet und auf Nachrichten lauscht.
Dieser stammt von Thomas Perl und es gibt ihn hier: https://thpinfo.com/2007/python-jabberbot/.

So siehts aus

… wenn man den Bot in seiner Liste hat und anschreibt.

Testen

Zum Ausprobieren kann jeder auf unseren Mumble Server kommen, wo der Bot läuft…
Direkt zu unserem Server verbinden

Das Script

Der Code ist unschön, aber es funktioniert :)

mocbot.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# by Hubert Chathi, 2007, 2008
# This file is hereby placed in the public domain.  Feel free to modify
# and redistribute at will.
# (Note, however, that python-jabberbot, which this file depends on, is
# licensed under the GNU GPL v3 or later, and xmppy is licensed under the
# GNU GPL v2 or later.)
 
#Changed the original script to control moc over jabber.
#2010-07-14 Natenom@natenom.com
#Version 0.0.3
 
import xmpp
import os
import jabberbot
from ConfigParser import RawConfigParser
import time
from subprocess import Popen, PIPE
 
 
class SystemBot(jabberbot.JabberBot):
    #Befehle werden erst abgearbeitet, wenn eine Gewisse Zeit vergangen ist, in Sekunden
    timebeforenew=1
 
    #letztes command war (timestamp)
    lasthelptimestamp=0
    lastcmdtimestamp=0
 
    def humanize_time(self,secs):
  mins, secs = divmod(secs, 60)
	hours, mins = divmod(mins, 60)
	return '%02d:%02d:%02d' % (hours, mins, secs)
 
    def printDebug(self,mess,args):
	"""Gibt Infos aus wer welche Commands schreibt"""
	print "From: ", mess.getFrom()
	print "Args: ", args
	print "Last command (timestamp): ", self.lastcmdtimestamp
 
    def isinlist(self,user):
	#wenn Benutzer in Liste, dann true
	if (user == "asdfasdfasdfasdf3r2@jabber.org/Kopete") or (user == "justsomfdg4@jabber.org/Kopete"):
	    return True
	else:
	    return False
 
    def timeleft(self):
	"""checks if time left"""
	if ( (time.time() - self.lastcmdtimestamp) >  self.timebeforenew):
	    return True
	else:
	    return False
 
    def bot_next(self, mess, args):
	"""Next Song"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    return os.system("/usr/bin/mocp --next")
 
    def bot_prev(self, mess, args):
	"""Previous Song"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    return os.system("/usr/bin/mocp --prev")
 
    def bot_seek(self, mess, args): 
	"""Seek by 20 seconds"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
 
	    seekby=20
 
	    return os.system("/usr/bin/mocp --seek %s" % (seekby))
 
    def bot_pause(self, mess, args): 
	"""Pause/Unpause"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    return os.system("/usr/bin/mocp --toggle-pause")
 
    def bot_shuffleon(self, mess, args): 
	"""Turn on shuffle mode"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    os.system("/usr/bin/mocp --on shuffle")
	    return "Shuffle is enabled"
 
    def bot_shuffleoff(self, mess, args): 
	"""Turn off shuffle mode"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    os.system("/usr/bin/mocp --off shuffle")
	    return "Shuffle is disabled"
 
    def bot_play(self, mess, args): 
	"""Play"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    return os.system("/usr/bin/mocp --play")
 
    def bot_stop(self, mess, args): 
	"""Stop"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
	    return os.system("/usr/bin/mocp --stop")
 
    def bot_info(self, mess, args): 
	"""Songinfo: Artist - Title - Duration"""
	if self.isinlist(mess.getFrom()) or (self.timeleft()):
	    self.lastcmdtimestamp=time.time()
 
	    songtitle=Popen(["/usr/bin/mocp", "--format", "%title"], stdout=PIPE).communicate()[0]
	    if songtitle: #Wenn das NULL ist, laeuft gerade kein Stueck und wir brauchen auch nicht weiter abfragen.
	      songartist=Popen(["/usr/bin/mocp", "--format", "%artist"], stdout=PIPE).communicate()[0]
	      songtotaltime=Popen(["/usr/bin/mocp", "--format", "%tt"], stdout=PIPE).communicate()[0]
	      songnow="%s - %s - %s - Rating: %s" % (songartist.strip(), songtitle.strip(), songtotaltime.strip(), 'NA')
	    else:
	      songnow="Player is stopped."
 
	    return songnow
 
    def idle_proc(self):
        status = []
 
        status = '\n'.join(status)
        # TODO: set "show" based on load? e.g. > 1 means "away"
        if not hasattr(self, 'laststatus') or self.laststatus != status:
            self.conn.send(xmpp.Presence(status=status))
            self.laststatus = status
        return
 
 
if __name__ == '__main__':
    config = RawConfigParser()
    config.read(['/etc/systembot.cfg','systembot.cfg'])
 
    bot = SystemBot(config.get('systembot','username'),
		    config.get('systembot','password'))
    bot.serve_forever()
linux/scripte/moc/jabberbot.txt · Zuletzt geändert: 2015/11/26 19:38 von Natenom