Bot Changes
Decommissioned OreAlert since it was implemented in f2f2bc3233
Renamed the MCM Discord bot to clarify
reminder
parent
2de89f988c
commit
b44210e922
116
api/bot.py
116
api/bot.py
|
@ -235,7 +235,6 @@ class Discord(discord.Client):
|
||||||
header = "**The following users do not have an application or player match on the whitelist:**\n"
|
header = "**The following users do not have an application or player match on the whitelist:**\n"
|
||||||
yield from self.discord_message(message.author, "{}```{}```".format(header, "\n".join(no_application)))
|
yield from self.discord_message(message.author, "{}```{}```".format(header, "\n".join(no_application)))
|
||||||
|
|
||||||
|
|
||||||
def build_info(self, application):
|
def build_info(self, application):
|
||||||
embed = discord.Embed(colour=discord.Colour(0x417505))
|
embed = discord.Embed(colour=discord.Colour(0x417505))
|
||||||
embed.set_thumbnail(
|
embed.set_thumbnail(
|
||||||
|
@ -266,123 +265,8 @@ class Discord(discord.Client):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def run_bot(self):
|
def run_bot(self):
|
||||||
self.run(self.token)
|
self.run(self.token)
|
||||||
|
|
||||||
|
|
||||||
class OreAlert:
|
|
||||||
# Options
|
|
||||||
log = os.path.join(settings.MINECRAFT_BASE_DIR, 'logs/latest.log')
|
|
||||||
purge = 30 # How long until we purge, in minutes
|
|
||||||
rotate = 5 # How long without input before we assume the log has rotated
|
|
||||||
notify_start = 5 # How many veins found within the above purge minutes to notify
|
|
||||||
notify_each = 1 # After the initial alert, how many should be found in addition before more alerts?
|
|
||||||
notify_ping = 5 # After the initial alert, how many should be found in addition before more pings?
|
|
||||||
|
|
||||||
playerList = []
|
|
||||||
|
|
||||||
class Player:
|
|
||||||
|
|
||||||
def __init__(self, name, time, prev=[]):
|
|
||||||
self.name = name
|
|
||||||
self.time = time
|
|
||||||
self.prev = prev
|
|
||||||
|
|
||||||
def compare(self, player):
|
|
||||||
if self.name == player.name:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def to_string(self):
|
|
||||||
return str(self.name) + ": " + str(self.time) + ", previous: " + self.prev_to_string()
|
|
||||||
|
|
||||||
def prev_to_string(self):
|
|
||||||
ret = ""
|
|
||||||
if len(self.prev) > 0:
|
|
||||||
for p in self.prev:
|
|
||||||
ret += str(p) + " "
|
|
||||||
|
|
||||||
return ret.rstrip()
|
|
||||||
else:
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def minute_interval(self, start, end):
|
|
||||||
reverse = False
|
|
||||||
if start > end:
|
|
||||||
start, end = end, start
|
|
||||||
reverse = True
|
|
||||||
delta = (end.hour - start.hour) * 60 + end.minute - start.minute + (end.second - start.second) / 60.0
|
|
||||||
if reverse:
|
|
||||||
delta = 24 * 60 - delta
|
|
||||||
return delta
|
|
||||||
|
|
||||||
def follow(self, filename):
|
|
||||||
thefile = open(filename, 'r', encoding='utf-8')
|
|
||||||
thefile.seek(0, 2) # Go to the end of the file
|
|
||||||
start = datetime.datetime.now()
|
|
||||||
end = datetime.datetime.now()
|
|
||||||
api.discord_notification('OreAlert has started successfully.')
|
|
||||||
while True:
|
|
||||||
line = thefile.readline()
|
|
||||||
if not line:
|
|
||||||
if self.minute_interval(start, end) > self.rotate:
|
|
||||||
thefile.close()
|
|
||||||
time.sleep(5)
|
|
||||||
thefile = open(filename, 'r', encoding='utf-8')
|
|
||||||
thefile.seek(0, 2) # Go to the end of the file
|
|
||||||
start = datetime.datetime.now()
|
|
||||||
end = datetime.datetime.now()
|
|
||||||
# api.discord_notification('OreAlert has closed and re-opened the log...hopefully it just rotated.')
|
|
||||||
continue
|
|
||||||
end = end + datetime.timedelta(milliseconds=100)
|
|
||||||
time.sleep(0.1) # Sleep briefly
|
|
||||||
continue
|
|
||||||
start = datetime.datetime.now()
|
|
||||||
end = datetime.datetime.now()
|
|
||||||
yield line
|
|
||||||
|
|
||||||
def run_bot(self):
|
|
||||||
cur_line = ""
|
|
||||||
try:
|
|
||||||
loglines = self.follow(self.log)
|
|
||||||
for line in loglines:
|
|
||||||
# [00: 03:46] [Server thread / INFO]: [MinecraftManager]: [OreAlert]: Etzelia
|
|
||||||
if "MinecraftManager" in line and "OreAlert" in line: # Filter out non-OreAlert log statements
|
|
||||||
cur_time = line.split()[0].replace("[", "").replace("]", "")
|
|
||||||
if ":" in cur_time: # Make sure we have a time.
|
|
||||||
time_array = cur_time.split(":")
|
|
||||||
name = line.split()[-1]
|
|
||||||
dt = datetime.time(int(time_array[0]), int(time_array[1]), int(time_array[2]))
|
|
||||||
p = self.Player(name, dt)
|
|
||||||
new_player = True
|
|
||||||
for player in self.playerList:
|
|
||||||
if p.compare(player):
|
|
||||||
new_player = False
|
|
||||||
player.prev[:] = [x for x in player.prev if not self.minute_interval(x,
|
|
||||||
dt) > self.purge] # First, purge any times older than our configured amount
|
|
||||||
player.prev.append(dt) # Add the new time
|
|
||||||
if len(player.prev) >= self.notify_start:
|
|
||||||
# MCM Alert
|
|
||||||
if len(player.prev) == self.notify_start:
|
|
||||||
api.create_alert("OreAlert: {0}".format(player.name))
|
|
||||||
if len(player.prev) % self.notify_each == 0:
|
|
||||||
# In-game Notification
|
|
||||||
api.plugin(api.PLUGIN_STAFF_CHAT,
|
|
||||||
"OreAlert {0} has found {1} diamond ore veins within {2} minutes.".format(
|
|
||||||
player.name, len(player.prev), self.purge))
|
|
||||||
# Discord Notification
|
|
||||||
ping = True if len(player.prev) % self.notify_ping == 0 else False
|
|
||||||
api.discord_notification(
|
|
||||||
'{0} has found {1} diamond ore veins within {2} minutes.'.format(
|
|
||||||
player.name.replace("_", "\\_"), len(player.prev), self.purge), ping=ping)
|
|
||||||
if new_player:
|
|
||||||
p.prev = [p.time]
|
|
||||||
self.playerList.append(p)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
api.discord_notification("OreAlert has been stopped manually.")
|
|
||||||
except:
|
|
||||||
api.discord_notification("OreAlert has crashed!", ping=True)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
import os, sys, django
|
|
||||||
|
|
||||||
sep = os.sep
|
|
||||||
path = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
path = path.split(sep)[:-3]
|
|
||||||
project = path[-1]
|
|
||||||
path = sep.join(path)
|
|
||||||
sys.path.append(path)
|
|
||||||
print("Setting path for {0}: {1}".format(project, path))
|
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(project))
|
|
||||||
django.setup()
|
|
||||||
|
|
||||||
from minecraft_manager.api.bot import OreAlert
|
|
||||||
|
|
||||||
bot = OreAlert()
|
|
||||||
bot.run_bot()
|
|
Loading…
Reference in New Issue