better late than never
This commit is contained in:
commit
cd7b616700
|
@ -0,0 +1,83 @@
|
|||
import asyncio
|
||||
|
||||
from irctokens import build, Line
|
||||
from ircrobots import Bot as BaseBot
|
||||
from ircrobots import Server as BaseServer
|
||||
from ircrobots import ConnectionParams
|
||||
|
||||
from botany import IRCBotany as Botany
|
||||
|
||||
from secrets import PASSWORD
|
||||
|
||||
channels = [
|
||||
"#bots",
|
||||
# "#club",
|
||||
]
|
||||
helpmessage = "hey, i'm botanybot. i water plants on ~club. my prefix is % and i was made by randomuser. check out https://ttm.sh/Fki.txt for more information."
|
||||
|
||||
class Server(BaseServer):
|
||||
admin = 'rndusr'
|
||||
async def msg(self, chan, string, user=None):
|
||||
if user == None: await self.send(build("PRIVMSG", [chan, string]))
|
||||
else: await self.send(build("PRIVMSG", [chan, user + ": " + string]))
|
||||
async def line_read(self, line: Line):
|
||||
print(f"{self.name} < {line.format()}")
|
||||
if line.command == "001":
|
||||
await self.send(build("MODE", ["botanybot", "+B"]))
|
||||
await self.msg("nickserv", "identify " + PASSWORD)
|
||||
for i in channels:
|
||||
await self.send(build("JOIN", [i]))
|
||||
if line.command == "PRIVMSG":
|
||||
user = line.hostmask.nickname
|
||||
channel = line.params[0]
|
||||
if line.params[-1] == "!rollcall":
|
||||
await self.msg(channel, helpmessage, user)
|
||||
if line.params[-1][0] == '%':
|
||||
commands = line.params[-1][1:].split(' ')
|
||||
if commands[0] == "desc":
|
||||
if len(commands) == 2:
|
||||
b = Botany(commands[1])
|
||||
await self.msg(channel, b.plantDescription(), user)
|
||||
else:
|
||||
await self.msg(channel, "specify user", user)
|
||||
elif commands[0] == "water":
|
||||
if len(commands) == 2:
|
||||
b = Botany(commands[1])
|
||||
if(b.water("{} (via IRC)".format(user))):
|
||||
await self.msg(channel, b.watered(), user)
|
||||
else:
|
||||
await self.msg(channel, b.cantWater(), user)
|
||||
elif commands[0] == "help":
|
||||
await self.msg(channel, helpmessage, user)
|
||||
elif commands[0] == "join":
|
||||
if len(commands) == 2:
|
||||
if user == self.admin:
|
||||
await self.send(build("JOIN", [commands[1]]))
|
||||
await self.msg(channel, "joined the channel {}".format(commands[1]), user)
|
||||
elif commands[0] == "chowner":
|
||||
if len(commands) == 2:
|
||||
if user == self.admin:
|
||||
self.admin = commands[1]
|
||||
await self.msg(channel, "admin changed to {}".format(commands[1]), user)
|
||||
return
|
||||
else:
|
||||
await self.msg(channel, "error: you must be an admin!", user)
|
||||
return
|
||||
else:
|
||||
await self.msg(channel, "two arguments required", user)
|
||||
return
|
||||
async def line_send(self, line: Line):
|
||||
print(f"{self.name} > {line.format()}")
|
||||
|
||||
class Bot(BaseBot):
|
||||
def create_server(self, name:str):
|
||||
return Server(self, name)
|
||||
|
||||
async def main():
|
||||
bot = Bot()
|
||||
params = ConnectionParams("botanybot", "tilde.chat", 6697, True)
|
||||
await bot.add_server("tilde", params)
|
||||
await bot.run()
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
|
@ -0,0 +1,73 @@
|
|||
import json
|
||||
import time
|
||||
import os
|
||||
|
||||
class Botany:
|
||||
visitors = "/home/{}/.botany/visitors.json"
|
||||
plant = "/home/{}/.botany/{}_plant_data.json"
|
||||
def __init__(self, user):
|
||||
self.user = user
|
||||
def getVisitors(self):
|
||||
formatted = self.visitors.format(self.user)
|
||||
try:
|
||||
if os.stat(formatted).st_size > 0:
|
||||
with open(formatted) as fd:
|
||||
return json.load(fd)
|
||||
else:
|
||||
return []
|
||||
except FileNotFoundError:
|
||||
print("FileNotFoundError in getVisitors()")
|
||||
return False
|
||||
def insertVisitor(self, data, waterer):
|
||||
if data == False: return False
|
||||
formatted = self.visitors.format(self.user)
|
||||
data.append({"timestamp": int(time.time()), "user": waterer})
|
||||
try:
|
||||
with open(formatted, "w") as fd:
|
||||
json.dump(data, fd, indent=4)
|
||||
return True
|
||||
except PermissionError:
|
||||
print("PermissionError in insertVisitor()")
|
||||
return False
|
||||
except FileNotFoundError:
|
||||
print("FileNotFoundError in insertVisitor()")
|
||||
return False
|
||||
def getInfo(self):
|
||||
formatted = self.plant.format(self.user, self.user)
|
||||
try:
|
||||
with open(formatted) as fd:
|
||||
return json.load(fd)
|
||||
except:
|
||||
print("error in getInfo()")
|
||||
return []
|
||||
|
||||
class IRCBotany(Botany):
|
||||
def plantDescription(self):
|
||||
string = ""
|
||||
data = self.getInfo()
|
||||
if(data == []): return "{}'s invisible plant".format(self.user)
|
||||
|
||||
string += self.user
|
||||
print(self.user)
|
||||
string += "'s "
|
||||
if(data['is_dead']): string += "dead "
|
||||
string += data['description']
|
||||
string += ' '
|
||||
string += "generation "
|
||||
string += str(data['generation'])
|
||||
string += ' '
|
||||
string += "plant"
|
||||
|
||||
return string
|
||||
|
||||
def cantWater(self):
|
||||
return "I can't water {}!".format(self.plantDescription())
|
||||
|
||||
def watered(self):
|
||||
return "I watered {}!".format(self.plantDescription())
|
||||
|
||||
def dead(self):
|
||||
return "Your {} is dead!".format(self.plantDescription())
|
||||
|
||||
def water(self, waterer):
|
||||
return self.insertVisitor(self.getVisitors(), waterer)
|
|
@ -0,0 +1 @@
|
|||
PASSWORD='randomuser_bots'
|
Loading…
Reference in New Issue