diff --git a/configuration.default.ini b/configuration.default.ini
index d25b469..4128aab 100644
--- a/configuration.default.ini
+++ b/configuration.default.ini
@@ -37,6 +37,12 @@ listening_addr = 127.0.0.1
listening_port = 8181
[command]
+#This it the char (only on letter) the bot will recognize as a command
+command_symbol = !
+#this option split username, in case you use such kind of mumo plugins https://wiki.mumble.info/wiki/Mumo#Set_Status
+split_username_at_space = False
+
+
play_file = file
play_url = url
play_radio = radio
@@ -55,6 +61,14 @@ queue = queue
repeat = repeat
update = update
+user_ban = userban
+user_unban = userunban
+url_ban = urlban
+url_unban = urlunban
+
+#command to reload the ban list
+reload = reload
+
[radio]
ponyville = http://192.99.131.205:8000/stream.mp3
luna = http://radio.ponyvillelive.com:8002/stream
@@ -82,6 +96,8 @@ too_long = This music is too long, skipping !
download_in_progress = Download of %s in progress
no_possible = it's not possible to do that
removing_item = Removing entry %s from queue
+user_ban = You are ban, not allowed to do that !
+url_ban = This url isn't allowed !
help = Command available:
!file [path]
@@ -90,12 +106,22 @@ help = Command available:
!radio [url] - url of a stream
!list - display list of available tracks
!queue - display items in queue
+
!np - display the current music
!skip - jump to the next music of the playlist (of remove the X items if you add a number)
!stop - stop and clear the playlist
!oust - stop + Go to default channel
!v - get or change the volume (in %)
!joinme - join your own channel
+admin_help = Admin command:
+
!kill (kill the bot)
+
!update (update the bot)
+
!userban [user] (ban a user)
+
!userunban [user] (unban a user)
+
!urlban [url] (ban an url)
+
!urlunban [url] (unban an url)
+
!reload (reload the ban config)
+
[debug]
ffmpeg = False
mumbleConnection = False
diff --git a/media/url.py b/media/url.py
index 12ba514..5f9589f 100644
--- a/media/url.py
+++ b/media/url.py
@@ -16,6 +16,8 @@ def get_url_info(index=-1):
var.playlist[index]['title'] = info['title']
except youtube_dl.utils.DownloadError:
pass
+ except KeyError:
+ return True
else:
return True
return False
diff --git a/mumbleBot.py b/mumbleBot.py
index fb30df2..21b74a3 100644
--- a/mumbleBot.py
+++ b/mumbleBot.py
@@ -32,6 +32,9 @@ class MumbleBot:
def __init__(self, args):
signal.signal(signal.SIGINT, self.ctrl_caught)
self.volume = var.config.getfloat('bot', 'volume')
+ if db.has_option('bot', 'volume'):
+ self.volume = var.db.getfloat('bot', 'volume')
+
self.channel = args.channel
FORMAT = '%(asctime)s: %(message)s'
@@ -77,11 +80,11 @@ class MumbleBot:
password = var.config.get("server", "password")
if args.user:
- username = args.user
+ self.username = args.user
else:
- username = var.config.get("bot", "username")
+ self.username = var.config.get("bot", "username")
- self.mumble = pymumble.Mumble(host, user=username, port=port, password=password,
+ self.mumble = pymumble.Mumble(host, user=self.username, port=port, password=password,
debug=var.config.getboolean('debug', 'mumbleConnection'), certfile=args.certificate)
self.mumble.callbacks.set_callback("text_received", self.message_received)
@@ -108,7 +111,9 @@ class MumbleBot:
def message_received(self, text):
message = text.message.strip()
user = self.mumble.users[text.actor]['name']
- if message[0] == '!':
+ if var.config.getboolean('command', 'split_username_at_space'):
+ user = user.split()[0]
+ if message[0] == var.config.get('command', 'command_symbol'):
message = message[1:].split(' ', 1)
if len(message) > 0:
command = message[0]
@@ -133,6 +138,53 @@ class MumbleBot:
self.mumble.users[text.actor].send_message(var.config.get('strings', 'pm_not_allowed'))
return
+ for i in var.db.items("user_ban"):
+ if user.lower() == i[0]:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'user_ban'))
+ return
+
+ if command == var.config.get('command', 'user_ban'):
+ if self.is_admin(user):
+ if parameter:
+ self.mumble.users[text.actor].send_message(util.user_ban(parameter))
+ else:
+ self.mumble.users[text.actor].send_message(util.get_user_ban())
+ else:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
+ return
+
+ elif command == var.config.get('command', 'user_unban'):
+ if self.is_admin(user):
+ if parameter:
+ self.mumble.users[text.actor].send_message(util.user_unban(parameter))
+ else:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
+ return
+
+ elif command == var.config.get('command', 'url_ban'):
+ if self.is_admin(user):
+ if parameter:
+ self.mumble.users[text.actor].send_message(util.url_ban(self.get_url_from_input(parameter)))
+ else:
+ self.mumble.users[text.actor].send_message(util.get_url_ban())
+ else:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
+ return
+
+ elif command == var.config.get('command', 'url_unban'):
+ if self.is_admin(user):
+ if parameter:
+ self.mumble.users[text.actor].send_message(util.url_unban(self.get_url_from_input(parameter)))
+ else:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
+ return
+
+ if parameter:
+ for i in var.db.items("url_ban"):
+ if self.get_url_from_input(parameter.lower()) == i[0]:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban'))
+ return
+
if command == var.config.get('command', 'play_file') and parameter:
music_folder = var.config.get('bot', 'music_folder')
# sanitize "../" and so on
@@ -163,7 +215,6 @@ class MumbleBot:
self.async_download_next()
elif command == var.config.get('command', 'play_url') and parameter:
-
music = {'type': 'url',
'url': self.get_url_from_input(parameter),
'user': user,
@@ -175,6 +226,12 @@ class MumbleBot:
var.playlist.pop()
self.send_msg(var.config.get('strings', 'too_long'), text)
else:
+ for i in var.db.options("url_ban"):
+ print(i, ' -> ', {var.playlist[-1]["url"]})
+ if var.playlist[-1]['url'] == i:
+ self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban'))
+ var.playlist.pop()
+ return
var.playlist[-1]['ready'] = "no"
self.async_download_next()
else:
@@ -313,7 +370,7 @@ class MumbleBot:
self.send_msg(msg, text)
elif command == var.config.get('command', 'repeat'):
- var.playlist.append([var.playlist[0]["type"], var.playlist[0]["path"], var.playlist[0]["user"]])
+ var.playlist.append(var.playlist[0])
else:
self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_command'))
@@ -549,10 +606,10 @@ if __name__ == '__main__':
args = parser.parse_args()
var.dbfile = args.db
config = configparser.ConfigParser(interpolation=None, allow_no_value=True)
- parsed_configs = config.read(['configuration.default.ini', args.config, var.dbfile], encoding='latin-1')
+ parsed_configs = config.read(['configuration.default.ini', args.config], encoding='latin-1')
- db = configparser.ConfigParser(interpolation=None, allow_no_value=True)
- db.read([var.dbfile], encoding='latin-1')
+ db = configparser.ConfigParser(interpolation=None, allow_no_value=True, delimiters='²')
+ db.read(var.dbfile, encoding='latin-1')
if len(parsed_configs) == 0:
logging.error('Could not read configuration from file \"{}\"'.format(args.config), file=sys.stderr)
diff --git a/util.py b/util.py
index 4bec3f3..38ca330 100644
--- a/util.py
+++ b/util.py
@@ -71,6 +71,48 @@ def write_db():
var.db.write(f)
+def get_user_ban():
+ res = "List of ban hash"
+ for i in var.db.items("user_ban"):
+ res += "
" + i[0]
+ return res
+
+
+def user_ban(user):
+ var.db.set("user_ban", user, None)
+ res = "User " + user + " banned"
+ write_db()
+ return res
+
+
+def user_unban(user):
+ var.db.remove_option("user_ban", user)
+ res = "Done"
+ write_db()
+ return res
+
+
+def get_url_ban():
+ res = "List of ban hash"
+ for i in var.db.items("url_ban"):
+ res += "
" + i[0]
+ return res
+
+
+def url_ban(url):
+ var.db.set("url_ban", url, None)
+ res = "url " + url + " banned"
+ write_db()
+ return res
+
+
+def url_unban(url):
+ var.db.remove_option("url_ban", url)
+ res = "Done"
+ write_db()
+ return res
+
+
class Dir(object):
def __init__(self, path):
self.name = os.path.basename(path.strip('/'))