dev-prodId #1
358
cogs/IdaCogs.py
Normal file
358
cogs/IdaCogs.py
Normal file
|
|
@ -0,0 +1,358 @@
|
||||||
|
import discord
|
||||||
|
from discord import option
|
||||||
|
from discord.ext import commands, tasks
|
||||||
|
import aiohttp
|
||||||
|
import helpers
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
class IdaCogs(commands.Cog):
|
||||||
|
def __init__(self, bot):
|
||||||
|
self.bot = bot
|
||||||
|
self.commodities = []
|
||||||
|
self.session = None
|
||||||
|
self.gsheetToken = helpers.readToken("sheet.token")
|
||||||
|
self.stationName = helpers.getStationName()
|
||||||
|
self.stationUrl = helpers.getStationUrl()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("help")
|
||||||
|
|
||||||
|
@commands.Cog.listener()
|
||||||
|
async def on_ready(self):
|
||||||
|
self.session = aiohttp.ClientSession()
|
||||||
|
self.writeToWhatsLeftToHaul.start()
|
||||||
|
self.writeTocarrierState.start()
|
||||||
|
print("I'm ready, cog bitch")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#auto complete
|
||||||
|
async def getCarriers(self, ctx: discord.AutocompleteContext):
|
||||||
|
state = await helpers.getInternalCarrierState(self.session, self.gsheetToken)
|
||||||
|
carrierList = await helpers.getListOfCarriers(state)
|
||||||
|
# print(carrierList)
|
||||||
|
# return [carrier for carriers in carrierList]
|
||||||
|
return carrierList
|
||||||
|
|
||||||
|
async def getCommodities(self, ctx: discord.AutocompleteContext):
|
||||||
|
return [commodity for commodity in self.commodities if commodity.lower().startswith(ctx.value.lower())]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# delivery command
|
||||||
|
# guild IDs are both IDA servers
|
||||||
|
@discord.slash_command(
|
||||||
|
name="delivery",
|
||||||
|
# guild_ids=[401372086746087425],
|
||||||
|
description= "sends your delivery to the bot!"
|
||||||
|
)
|
||||||
|
@option("commodity",required=True,
|
||||||
|
description="The Commodity you want to deliver",
|
||||||
|
autocomplete=getCommodities)
|
||||||
|
@option("quantity",required=True,
|
||||||
|
description="Please be nice and input a value between 1 and 1326 (new rack update!!!!1!1)",
|
||||||
|
type=int, min_value=1, max_value=1326)
|
||||||
|
@option("target", required=True,
|
||||||
|
description="Are you delivering to a carrier or the target station?",
|
||||||
|
type=str, choices=['Station', 'Carrier'])
|
||||||
|
|
||||||
|
async def delivery(self, ctx,commodity, quantity,target):
|
||||||
|
|
||||||
|
author = str(ctx.author)
|
||||||
|
author = author[:author.find(" ")]
|
||||||
|
|
||||||
|
await ctx.defer()
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"postType":"delivery",
|
||||||
|
"username":author,
|
||||||
|
"commodity": commodity,
|
||||||
|
"quantity": quantity,
|
||||||
|
"target": target
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = await helpers.postToSheet(self.session, data, self.gsheetToken)
|
||||||
|
if response == 200:
|
||||||
|
await ctx.followup.send(f"your delivery of {quantity} of {commodity} to a {target} has been added to the sheet!")
|
||||||
|
print(f"[{datetime.isoformat(datetime.now())}]{author} delivery of {quantity} of {commodity} to a {target}")
|
||||||
|
await helpers.writeDeliveryToCommandFile(author, data)
|
||||||
|
else:
|
||||||
|
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.followup.send(f"help : Error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# delivery command for misc commodity only
|
||||||
|
# guild IDs are both IDA servers
|
||||||
|
@discord.slash_command(
|
||||||
|
name="misc",
|
||||||
|
# guild_ids=[401372086746087425],
|
||||||
|
description= "Used for the commodities we're too lazy to create a sheet for"
|
||||||
|
)
|
||||||
|
async def misc(self, ctx,
|
||||||
|
quantity: discord.Option(discord.SlashCommandOptionType.integer, description="Please be nice and input a value between 1 and 1326 (new rack update!!!!1!1)", min_value=1, max_value=1326),
|
||||||
|
target: discord.Option(str, choices=['Station', 'Carrier'])
|
||||||
|
):
|
||||||
|
|
||||||
|
author = str(ctx.author)
|
||||||
|
author = author[:author.find(" ")]
|
||||||
|
|
||||||
|
await ctx.defer()
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"postType":"delivery",
|
||||||
|
"username":author,
|
||||||
|
"commodity": "Misc",
|
||||||
|
"quantity": quantity,
|
||||||
|
"target": target
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = await helpers.postToSheet(self.session, data, self.gsheetToken )
|
||||||
|
if response == 200:
|
||||||
|
await ctx.followup.send(f"your delivery of {quantity} of Miscellaneous stuff to a {target} has been added to the sheet!")
|
||||||
|
print(f"[{datetime.isoformat(datetime.now())}]{author} delivery of {quantity} of Miscellaneous to a {target}")
|
||||||
|
await helpers.writeDeliveryToCommandFile(author, data)
|
||||||
|
else:
|
||||||
|
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.followup.send(f"help : Error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@discord.slash_command(
|
||||||
|
name="last",
|
||||||
|
# guild_ids=[401372086746087425],
|
||||||
|
description= "send the last delivery you made again!"
|
||||||
|
)
|
||||||
|
async def last(self, ctx):
|
||||||
|
|
||||||
|
author = str(ctx.author)
|
||||||
|
author = author[:author.find(" ")]
|
||||||
|
|
||||||
|
data = await helpers.getDataFromDeliveryFile(author)
|
||||||
|
|
||||||
|
await ctx.defer()
|
||||||
|
|
||||||
|
|
||||||
|
if data is not None:
|
||||||
|
try:
|
||||||
|
response = await helpers.postToSheet(self.session, data, self.gsheetToken)
|
||||||
|
if response == 200:
|
||||||
|
await ctx.followup.send(f"your delivery of {data['quantity']} of {data['commodity']} to a {data['target']} has been added to the sheet!")
|
||||||
|
print(f"[{datetime.isoformat(datetime.now())}] delivery of {data['quantity']} of {data['commodity']} to a {data['target']}")
|
||||||
|
await helpers.writeDeliveryToCommandFile(author, data)
|
||||||
|
else:
|
||||||
|
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.followup.send(f"help : Error: {e}")
|
||||||
|
else:
|
||||||
|
await ctx.followup.send(f"You haven't delivered to this build yet, or I have amnesia.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#change url command
|
||||||
|
@discord.slash_command(
|
||||||
|
name="change-sheet-url",
|
||||||
|
# guild_ids=[401372086746087425],
|
||||||
|
description= "changes the URL of the active sheet, use with caution"
|
||||||
|
)
|
||||||
|
async def changeSheetUrl(self, ctx,
|
||||||
|
url:discord.Option(discord.SlashCommandOptionType.string, description="the new URL")
|
||||||
|
):
|
||||||
|
|
||||||
|
await ctx.defer()
|
||||||
|
try:
|
||||||
|
with open("../sheet.token", 'w') as f:
|
||||||
|
f.write(url)
|
||||||
|
|
||||||
|
await ctx.followup.send(f"URL has been set to {url}")
|
||||||
|
self.gsheetToken = helpers.readToken("../sheet.token")
|
||||||
|
await helpers.delLastCommandFile()
|
||||||
|
print("deleted command.last file content")
|
||||||
|
|
||||||
|
# gets the name and URL from the sheet, then store it in a file so we don't ask the sheet again.
|
||||||
|
name, url = (await helpers.getFromSheet(self.gsheetToken, "sheet")).split("|")
|
||||||
|
|
||||||
|
with open("../station.name", 'w') as f:
|
||||||
|
f.write(name)
|
||||||
|
self.stationName = name
|
||||||
|
|
||||||
|
with open("../station.url", 'w') as f:
|
||||||
|
f.write(url)
|
||||||
|
self.stationUrl = url
|
||||||
|
|
||||||
|
self.writeToWhatsLeftToHaul.restart()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.followup.send(f"something shat the bed")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@discord.slash_command(
|
||||||
|
name="setcarrierstate",
|
||||||
|
# guild_ids=[401372086746087425],
|
||||||
|
description= "Sets a carrier state on the sheet"
|
||||||
|
)
|
||||||
|
@option("carrier", description="The carrier you want to edit", autocomplete=getCarriers)
|
||||||
|
@option("state",required=True, description="The carrier you want to edit", choices=["Loading","Unloading","Full","Empty","Inactive"])
|
||||||
|
async def setCarrierState(self, ctx, carrier, state):
|
||||||
|
response = await helpers.getFromSheet(self.session, self.gsheetToken, "carrier")
|
||||||
|
|
||||||
|
#transforms the response into a dict (carrier : state) we can use
|
||||||
|
carrierState = await helpers.parseCarrierState(response)
|
||||||
|
author = str(ctx.author)
|
||||||
|
|
||||||
|
carrierState[carrier] = state
|
||||||
|
|
||||||
|
rawState = await helpers.toRawState(carrierState)
|
||||||
|
|
||||||
|
#print(rawState)
|
||||||
|
|
||||||
|
await ctx.defer()
|
||||||
|
i = 1
|
||||||
|
text = "Current Carrier State : \n"
|
||||||
|
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"postType":"carrier",
|
||||||
|
"carrierState": rawState
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = await helpers.postToSheet(self.session, data, self.gsheetToken)
|
||||||
|
if response == 200:
|
||||||
|
await ctx.followup.send(f"The carrier {carrier} has been set to {state}")
|
||||||
|
print(f"{author} set {carrier} state to {state}")
|
||||||
|
channel = self.bot.get_channel(1521963883018063882)
|
||||||
|
await channel.send(f"{author} set {carrier} state to {state}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
await ctx.followup.send(f"i fucked up ")
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.followup.send(f"help : Error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#writes to the whats left to haul channel ever 60 seconds about.. the stuff left to haul.
|
||||||
|
#also updates the current commodity List
|
||||||
|
@tasks.loop(seconds=60)
|
||||||
|
async def writeToWhatsLeftToHaul(self):
|
||||||
|
|
||||||
|
|
||||||
|
response = await helpers.getFromSheet(self.session, self.gsheetToken, "commodity")
|
||||||
|
|
||||||
|
|
||||||
|
commodity, values, initial = response.split("|")
|
||||||
|
|
||||||
|
commodity = commodity.split(",")
|
||||||
|
values = values.split(",")
|
||||||
|
initial = initial.split(",")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
values = [int(i) for i in values]
|
||||||
|
initial = [int (i) for i in initial]
|
||||||
|
|
||||||
|
|
||||||
|
finalDict = {}
|
||||||
|
progressDict = {}
|
||||||
|
neededCommodity = []
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(len(commodity)):
|
||||||
|
finalDict[commodity[i]] = values[i]
|
||||||
|
if initial[i] > 0:
|
||||||
|
progressDict[commodity[i]] = await helpers.createProgressBar(values[i],initial[i])
|
||||||
|
neededCommodity.append(commodity[i])
|
||||||
|
else:
|
||||||
|
progressDict[commodity[i]] = await helpers.createProgressBar(1,1)
|
||||||
|
|
||||||
|
#finalDict = dict(sorted(finalDict.items(), key=lambda item: item[1], reverse=True))
|
||||||
|
|
||||||
|
self.commodities = neededCommodity
|
||||||
|
|
||||||
|
embed = discord.Embed(title="Estimated remaining amounts",
|
||||||
|
colour=discord.Colour(0xffdd55),
|
||||||
|
timestamp=datetime.now())
|
||||||
|
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
||||||
|
|
||||||
|
embed2 = discord.Embed(title="Current progress",
|
||||||
|
colour=discord.Colour(0x002f80),
|
||||||
|
timestamp=datetime.now())
|
||||||
|
embed2.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for key in finalDict:
|
||||||
|
if finalDict[key] > 0:
|
||||||
|
embed.add_field(name=key, value=finalDict[key], inline=True)
|
||||||
|
embed2.add_field(name=key, value=str(progressDict[key]), inline=True)
|
||||||
|
|
||||||
|
|
||||||
|
embed2.set_footer(text="This message updates every 60 seconds(ish). Last updated")
|
||||||
|
embed.set_author(name=u'\U0001F517 ' + self.stationName + u' \U0001F517',
|
||||||
|
url=self.stationUrl)
|
||||||
|
embed2.set_author(name=u'\U0001F517 ' + self.stationName + u' \U0001F517',
|
||||||
|
url=self.stationUrl)
|
||||||
|
|
||||||
|
|
||||||
|
channel = self.bot.get_channel(1519457137234022460)
|
||||||
|
|
||||||
|
found = False
|
||||||
|
async for oldmsg in channel.history(limit=2):
|
||||||
|
if oldmsg.author == self.bot.user:
|
||||||
|
found = True
|
||||||
|
await oldmsg.edit(embeds=[embed, embed2])
|
||||||
|
break
|
||||||
|
if not found:
|
||||||
|
await channel.send(embeds=[embed, embed2])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#writes the carriers state to... the carrier state channel. Seriously, who is writing this?
|
||||||
|
@tasks.loop(seconds=60)
|
||||||
|
async def writeTocarrierState(self):
|
||||||
|
response = await helpers.getInternalCarrierState(self.session, self.gsheetToken)
|
||||||
|
carrierState = await helpers.parseCarrierState(response)
|
||||||
|
|
||||||
|
|
||||||
|
channel = self.bot.get_channel(1521596285981819101)
|
||||||
|
|
||||||
|
embed = discord.Embed(title="Carriers State",
|
||||||
|
colour=discord.Colour(0x29ac08),
|
||||||
|
timestamp=datetime.now())
|
||||||
|
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
||||||
|
embed.set_author(name=u'\U0001F517 ' + self.stationName + u' \U0001F517',
|
||||||
|
url=self.stationUrl)
|
||||||
|
|
||||||
|
embed.set_footer(text="This message updates every 60 seconds(ish). Last updated")
|
||||||
|
|
||||||
|
for carrier, state in carrierState.items():
|
||||||
|
embed.add_field(name=carrier, value=state, inline=True)
|
||||||
|
|
||||||
|
|
||||||
|
found = False
|
||||||
|
async for oldmsg in channel.history(limit=2):
|
||||||
|
if oldmsg.author == self.bot.user:
|
||||||
|
found = True
|
||||||
|
await oldmsg.edit(embed=embed)
|
||||||
|
break
|
||||||
|
if not found:
|
||||||
|
await channel.send(embed=embed)
|
||||||
|
|
||||||
|
def setup(bot): # this is called by Pycord to setup the cog
|
||||||
|
bot.add_cog(IdaCogs(bot)) # add the cog to the bot
|
||||||
164
helpers.py
Normal file
164
helpers.py
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import ast
|
||||||
|
from math import floor
|
||||||
|
|
||||||
|
import discord
|
||||||
|
|
||||||
|
|
||||||
|
lastCommandFile = "command.last"
|
||||||
|
|
||||||
|
### reads token files
|
||||||
|
def readToken(filePath):
|
||||||
|
with open(filePath, 'r') as f:
|
||||||
|
return f.readline()
|
||||||
|
|
||||||
|
|
||||||
|
def getStationName():
|
||||||
|
#there's a small chance the files don't exist. If they don't we create an empty file.
|
||||||
|
try:
|
||||||
|
with open("station.name", 'r') as f:
|
||||||
|
return f.readline()
|
||||||
|
except FileNotFoundError:
|
||||||
|
open("station.name", 'w').close()
|
||||||
|
return "REPLACEME"
|
||||||
|
|
||||||
|
def getStationUrl():
|
||||||
|
try:
|
||||||
|
with open("station.url",'r') as f:
|
||||||
|
return f.readline()
|
||||||
|
except FileNotFoundError:
|
||||||
|
open("station.url", 'w').close()
|
||||||
|
return "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||||
|
|
||||||
|
|
||||||
|
### sends a get request to the sheet
|
||||||
|
async def getFromSheet(session, gsheetToken, data):
|
||||||
|
|
||||||
|
params = {"type":data}
|
||||||
|
|
||||||
|
async with session.get(gsheetToken, params=params) as response:
|
||||||
|
#print("Status:", response.status)
|
||||||
|
text = await response.text()
|
||||||
|
#print(text)
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
### takes a json, returns a http code
|
||||||
|
async def postToSheet(session, data, gsheetToken):
|
||||||
|
async with session.post(gsheetToken, json=data) as response:
|
||||||
|
text = await response.text()
|
||||||
|
#print(text)
|
||||||
|
#print("Status:", response.status)
|
||||||
|
return response.status
|
||||||
|
|
||||||
|
|
||||||
|
### carrier state parser, takes the values from the sheet and turn it into something we can use
|
||||||
|
|
||||||
|
async def parseCarrierState(state):
|
||||||
|
splitState = state.split(",")
|
||||||
|
|
||||||
|
carrierDict = {}
|
||||||
|
|
||||||
|
for i in range(0,len(splitState),2):
|
||||||
|
carrier = splitState[i]
|
||||||
|
state = splitState[i+1]
|
||||||
|
if carrier != "" and state != "":
|
||||||
|
carrierDict[carrier] = state
|
||||||
|
|
||||||
|
return carrierDict
|
||||||
|
|
||||||
|
### converts a dict to the sheet syntax (CSV)
|
||||||
|
async def toRawState(carrierDict :dict[str, str]):
|
||||||
|
|
||||||
|
rawState = []
|
||||||
|
|
||||||
|
for key,value in carrierDict.items():
|
||||||
|
rawState.append([key])
|
||||||
|
rawState.append([value])
|
||||||
|
|
||||||
|
rawLen = len(rawState)
|
||||||
|
|
||||||
|
for i in range(rawLen, 41):
|
||||||
|
rawState.append([""])
|
||||||
|
|
||||||
|
return rawState
|
||||||
|
|
||||||
|
|
||||||
|
async def getListOfCarriers(state):
|
||||||
|
splitState = state.split(",")
|
||||||
|
carrierList = []
|
||||||
|
for i in range(0,len(splitState),2):
|
||||||
|
carrier = splitState[i]
|
||||||
|
if carrier != "":
|
||||||
|
carrierList.append(carrier)
|
||||||
|
|
||||||
|
return carrierList
|
||||||
|
|
||||||
|
### used to query the carrier state internally. Why did I make this????
|
||||||
|
async def getInternalCarrierState(session, gsheetToken):
|
||||||
|
response = await getFromSheet(session, gsheetToken, "carrier")
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###creates a nice progress bar from two values
|
||||||
|
async def createProgressBar(a,b):
|
||||||
|
#print(a, b)
|
||||||
|
ratio = floor(((b-a)/b) * 10)
|
||||||
|
|
||||||
|
#print(ratio)
|
||||||
|
|
||||||
|
progressBar = f"{'◼'* ratio}{'◻'*(10-ratio)} {ratio*10}%"
|
||||||
|
|
||||||
|
return progressBar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#creates the file if it doesn't exist. stores last command used by... users on this delivery.
|
||||||
|
async def writeDeliveryToCommandFile(author, command):
|
||||||
|
|
||||||
|
#shitty hack to see if the file is empty
|
||||||
|
path = os.getcwd() + "/" + lastCommandFile
|
||||||
|
empty = os.stat(path).st_size < 1
|
||||||
|
|
||||||
|
with open(lastCommandFile, 'r') as f:
|
||||||
|
if empty:
|
||||||
|
jsonContent = json.loads("{}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
jsonContent = json.load(f)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
with open(lastCommandFile, 'w') as f:
|
||||||
|
jsonContent[author] = command
|
||||||
|
json.dump(jsonContent, f)
|
||||||
|
|
||||||
|
async def getDataFromDeliveryFile(author):
|
||||||
|
path = os.getcwd() + "/" + lastCommandFile
|
||||||
|
empty = os.stat(path).st_size < 1
|
||||||
|
|
||||||
|
with open(lastCommandFile, 'r') as f:
|
||||||
|
if empty:
|
||||||
|
return None
|
||||||
|
|
||||||
|
else:
|
||||||
|
jsonContent = json.load(f)
|
||||||
|
if author in jsonContent.keys():
|
||||||
|
return jsonContent[author]
|
||||||
|
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async def delLastCommandFile():
|
||||||
|
open(lastCommandFile, 'w').close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
550
main.py
550
main.py
|
|
@ -1,558 +1,32 @@
|
||||||
|
from discord.ext import commands
|
||||||
|
|
||||||
|
import helpers
|
||||||
import discord
|
|
||||||
from discord.ext import commands, tasks
|
|
||||||
from discord.commands import option
|
|
||||||
import json
|
|
||||||
from datetime import datetime
|
|
||||||
import aiohttp
|
|
||||||
import os
|
|
||||||
import asyncio
|
|
||||||
import ast
|
|
||||||
from math import floor
|
|
||||||
|
|
||||||
|
|
||||||
### reads token files
|
|
||||||
def readToken(filePath):
|
|
||||||
with open(filePath, 'r') as f:
|
|
||||||
return f.readline()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### sends a get request to the sheet
|
|
||||||
async def getFromSheet(gsheetToken, data):
|
|
||||||
|
|
||||||
params = {"type":data}
|
|
||||||
#print(params)
|
|
||||||
async with session.get(gsheetToken, params=params) as response:
|
|
||||||
#print("Status:", response.status)
|
|
||||||
text = await response.text()
|
|
||||||
#print(text)
|
|
||||||
return text
|
|
||||||
|
|
||||||
|
|
||||||
### takes a json, returns a http code
|
|
||||||
async def postToSheet(data, gsheetToken):
|
|
||||||
async with session.post(gsheetToken, json=data) as response:
|
|
||||||
text = await response.text()
|
|
||||||
#print(text)
|
|
||||||
#print("Status:", response.status)
|
|
||||||
return response.status
|
|
||||||
|
|
||||||
|
|
||||||
### carrier state parser, takes the values from the sheet and turn it into something we can use
|
|
||||||
|
|
||||||
async def parseCarrierState(state):
|
|
||||||
tupleList = []
|
|
||||||
splitState = state.split(",")
|
|
||||||
|
|
||||||
for i in range(0,len(splitState),2):
|
|
||||||
carrier = splitState[i]
|
|
||||||
state = splitState[i+1]
|
|
||||||
if carrier != "" and state != "":
|
|
||||||
tupleList.append((carrier, state))
|
|
||||||
|
|
||||||
return tupleList
|
|
||||||
|
|
||||||
### converts a list of tuple back to the sheet syntax (CSV)
|
|
||||||
async def toRawState(tupleList):
|
|
||||||
rawState = []
|
|
||||||
for value in tupleList:
|
|
||||||
for subval in value:
|
|
||||||
rawState.append([subval])
|
|
||||||
rawLen = len(rawState)
|
|
||||||
|
|
||||||
for i in range(rawLen, 41):
|
|
||||||
rawState.append([""])
|
|
||||||
|
|
||||||
return rawState
|
|
||||||
|
|
||||||
|
|
||||||
async def getListOfCarriers(state):
|
|
||||||
splitState = state.split(",")
|
|
||||||
carrierList = []
|
|
||||||
for i in range(0,len(splitState),2):
|
|
||||||
carrier = splitState[i]
|
|
||||||
if carrier != "":
|
|
||||||
carrierList.append(carrier)
|
|
||||||
|
|
||||||
return carrierList
|
|
||||||
|
|
||||||
### used to query the carrier state internally. Why did I make this????
|
|
||||||
async def getInternalCarrierState():
|
|
||||||
response = await getFromSheet(gsheetToken, "carrier")
|
|
||||||
return response
|
|
||||||
|
|
||||||
async def getCarriers(ctx: discord.AutocompleteContext):
|
|
||||||
state = await getInternalCarrierState()
|
|
||||||
carrierList = await getListOfCarriers(state)
|
|
||||||
# print(carrierList)
|
|
||||||
# return [carrier for carriers in carrierList]
|
|
||||||
return carrierList
|
|
||||||
|
|
||||||
|
|
||||||
async def getCommodities(ctx: discord.AutocompleteContext):
|
|
||||||
with open("commodity.needed","r") as f:
|
|
||||||
listOfCommodities = ast.literal_eval(f.readline())
|
|
||||||
return listOfCommodities
|
|
||||||
|
|
||||||
|
|
||||||
###creates a nice progress bar from two values
|
|
||||||
async def createProgressBar(a,b):
|
|
||||||
#print(a, b)
|
|
||||||
ratio = floor(((b-a)/b) * 10)
|
|
||||||
|
|
||||||
#print(ratio)
|
|
||||||
|
|
||||||
progressBar = f"{'◼'* ratio}{'◻'*(10-ratio)} {ratio*10}%"
|
|
||||||
|
|
||||||
return progressBar
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#creates the file if it doesn't exist. stores last command used by... users on this delivery.
|
|
||||||
async def writeDeliveryToCommandFile(author, command):
|
|
||||||
|
|
||||||
#shitty hack to see if the file is empty
|
|
||||||
path = os.getcwd() + "/" + lastCommandFile
|
|
||||||
empty = os.stat(path).st_size < 1
|
|
||||||
|
|
||||||
with open(lastCommandFile, 'r') as f:
|
|
||||||
if empty:
|
|
||||||
jsonContent = json.loads("{}")
|
|
||||||
|
|
||||||
else:
|
|
||||||
jsonContent = json.load(f)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
with open(lastCommandFile, 'w') as f:
|
|
||||||
jsonContent[author] = command
|
|
||||||
json.dump(jsonContent, f)
|
|
||||||
|
|
||||||
async def getDataFromDeliveryFile(author):
|
|
||||||
path = os.getcwd() + "/" + lastCommandFile
|
|
||||||
empty = os.stat(path).st_size < 1
|
|
||||||
|
|
||||||
with open(lastCommandFile, 'r') as f:
|
|
||||||
if empty:
|
|
||||||
return None
|
|
||||||
|
|
||||||
else:
|
|
||||||
jsonContent = json.load(f)
|
|
||||||
if author in jsonContent.keys():
|
|
||||||
return jsonContent[author]
|
|
||||||
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def delLastCommandFile():
|
|
||||||
open(lastCommandFile, 'w').close()
|
|
||||||
|
|
||||||
|
|
||||||
bot = commands.Bot()
|
bot = commands.Bot()
|
||||||
|
|
||||||
# various tokens and global vars
|
# various tokens
|
||||||
discordToken = readToken("discord.token")
|
discordToken = helpers.readToken("discord.token")
|
||||||
gsheetToken = readToken("sheet.token")
|
|
||||||
lastCommandFile = "command.last"
|
|
||||||
|
|
||||||
print("hey wassup")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#there's a small chance the files don't exist. If they don't we create an empty file.
|
|
||||||
try:
|
|
||||||
with open("station.name", 'r') as f:
|
|
||||||
stationName = f.readline()
|
|
||||||
except FileNotFoundError:
|
|
||||||
open("station.name", 'w').close()
|
|
||||||
stationName = "REPLACEME"
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open("station.url",'r') as f:
|
|
||||||
stationUrl = f.readline()
|
|
||||||
except FileNotFoundError:
|
|
||||||
open("station.url", 'w').close()
|
|
||||||
stationUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
|
||||||
|
|
||||||
# default command to see if the bot has lived
|
# default command to see if the bot has lived
|
||||||
@bot.listen()
|
@bot.listen()
|
||||||
async def on_connect():
|
async def on_connect():
|
||||||
global session
|
|
||||||
print("I'm alive, bitch")
|
print("I'm alive, bitch")
|
||||||
session = aiohttp.ClientSession()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@bot.event
|
@bot.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
writeToWhatsLeftToHaul.start()
|
|
||||||
writeTocarrierState.start()
|
|
||||||
|
|
||||||
print("I'm ready, bitch")
|
print("I'm ready, bitch")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# delivery command
|
|
||||||
# guild IDs are both IDA servers
|
|
||||||
@bot.slash_command(
|
|
||||||
name="delivery",
|
|
||||||
# guild_ids=[401372086746087425],
|
|
||||||
description= "sends your delivery to the bot!"
|
|
||||||
)
|
|
||||||
@option("commodity",required=True,
|
|
||||||
description="The Commodity you want to deliver",
|
|
||||||
autocomplete=getCommodities)
|
|
||||||
@option("quantity",required=True,
|
|
||||||
description="Please be nice and input a value between 1 and 1326 (new rack update!!!!1!1)",
|
|
||||||
type=int, min_value=1, max_value=1326)
|
|
||||||
@option("target", required=True,
|
|
||||||
description="Are you delivering to a carrier or the target station?",
|
|
||||||
type=str, choices=['Station', 'Carrier'])
|
|
||||||
|
|
||||||
async def delivery(ctx,commodity, quantity,target):
|
|
||||||
|
|
||||||
author = str(ctx.author)
|
|
||||||
author = author[:author.find(" ")]
|
|
||||||
|
|
||||||
await ctx.defer()
|
|
||||||
|
|
||||||
data = {
|
|
||||||
"postType":"delivery",
|
|
||||||
"username":author,
|
|
||||||
"commodity": commodity,
|
|
||||||
"quantity": quantity,
|
|
||||||
"target": target
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
response = await postToSheet(data, gsheetToken)
|
|
||||||
if response == 200:
|
|
||||||
await ctx.followup.send(f"your delivery of {quantity} of {commodity} to a {target} has been added to the sheet!")
|
|
||||||
print(f"[{datetime.isoformat(datetime.now())}]{author} delivery of {quantity} of {commodity} to a {target}")
|
|
||||||
await writeDeliveryToCommandFile(author, data)
|
|
||||||
else:
|
|
||||||
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
|
||||||
except Exception as e:
|
|
||||||
await ctx.followup.send(f"help : Error: {e}")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# delivery command for misc commodity only
|
|
||||||
# guild IDs are both IDA servers
|
|
||||||
@bot.slash_command(
|
|
||||||
name="misc",
|
|
||||||
# guild_ids=[401372086746087425],
|
|
||||||
description= "Used for the commodities we're too lazy to create a sheet for"
|
|
||||||
)
|
|
||||||
async def misc(ctx,
|
|
||||||
quantity: discord.Option(discord.SlashCommandOptionType.integer, description="Please be nice and input a value between 1 and 1326 (new rack update!!!!1!1)", min_value=1, max_value=1326),
|
|
||||||
target: discord.Option(str, choices=['Station', 'Carrier'])
|
|
||||||
):
|
|
||||||
|
|
||||||
author = str(ctx.author)
|
|
||||||
author = author[:author.find(" ")]
|
|
||||||
|
|
||||||
await ctx.defer()
|
|
||||||
|
|
||||||
data = {
|
|
||||||
"postType":"delivery",
|
|
||||||
"username":author,
|
|
||||||
"commodity": "Misc",
|
|
||||||
"quantity": quantity,
|
|
||||||
"target": target
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
response = await postToSheet(data, gsheetToken)
|
|
||||||
if response == 200:
|
|
||||||
await ctx.followup.send(f"your delivery of {quantity} of Miscellaneous stuff to a {target} has been added to the sheet!")
|
|
||||||
print(f"[{datetime.isoformat(datetime.now())}]{author} delivery of {quantity} of Miscellaneous to a {target}")
|
|
||||||
await writeDeliveryToCommandFile(author, data)
|
|
||||||
else:
|
|
||||||
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
|
||||||
except Exception as e:
|
|
||||||
await ctx.followup.send(f"help : Error: {e}")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@bot.slash_command(
|
|
||||||
name="last",
|
|
||||||
# guild_ids=[401372086746087425],
|
|
||||||
description= "send the last delivery you made again!"
|
|
||||||
)
|
|
||||||
async def last(ctx):
|
|
||||||
|
|
||||||
author = str(ctx.author)
|
|
||||||
author = author[:author.find(" ")]
|
|
||||||
|
|
||||||
data = await getDataFromDeliveryFile(author)
|
|
||||||
|
|
||||||
await ctx.defer()
|
|
||||||
|
|
||||||
|
|
||||||
if data is not None:
|
|
||||||
try:
|
|
||||||
response = await postToSheet(data, gsheetToken)
|
|
||||||
if response == 200:
|
|
||||||
await ctx.followup.send(f"your delivery of {data['quantity']} of {data['commodity']} to a {data['target']} has been added to the sheet!")
|
|
||||||
print(f"[{datetime.isoformat(datetime.now())}] delivery of {data['quantity']} of {data['commodity']} to a {data['target']}")
|
|
||||||
await writeDeliveryToCommandFile(author, data)
|
|
||||||
else:
|
|
||||||
await ctx.followup.send(f"Failed to log delivery (HTTP {response}). Please contact the yellow people if that keeps happening")
|
|
||||||
except Exception as e:
|
|
||||||
await ctx.followup.send(f"help : Error: {e}")
|
|
||||||
else:
|
|
||||||
await ctx.followup.send(f"You haven't delivered to this build yet, or I have amnesia.")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#change url command
|
|
||||||
@bot.slash_command(
|
|
||||||
name="change-sheet-url",
|
|
||||||
# guild_ids=[401372086746087425],
|
|
||||||
description= "changes the URL of the active sheet, use with caution"
|
|
||||||
)
|
|
||||||
async def changeSheetUrl(ctx,
|
|
||||||
url:discord.Option(discord.SlashCommandOptionType.string, description="the new URL")
|
|
||||||
):
|
|
||||||
global gsheetToken
|
|
||||||
global stationName
|
|
||||||
global stationURL
|
|
||||||
await ctx.defer()
|
|
||||||
try:
|
|
||||||
with open("sheet.token",'w') as f:
|
|
||||||
f.write(url)
|
|
||||||
|
|
||||||
await ctx.followup.send(f"URL has been set to {url}")
|
|
||||||
gsheetToken = readToken("sheet.token")
|
|
||||||
await delLastCommandFile()
|
|
||||||
print("deleted command.last file content")
|
|
||||||
|
|
||||||
# gets the name and URL from the sheet, then store it in a file so we don't ask the sheet again.
|
|
||||||
name, url = (await getFromSheet(gsheetToken, "sheet")).split("|")
|
|
||||||
|
|
||||||
with open("station.name", 'w') as f:
|
|
||||||
f.write(name)
|
|
||||||
stationName = name
|
|
||||||
|
|
||||||
with open("station.url", 'w') as f:
|
|
||||||
f.write(url)
|
|
||||||
stationURL = url
|
|
||||||
|
|
||||||
writeToWhatsLeftToHaul.restart()
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
await ctx.followup.send(f"something shat the bed")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@bot.slash_command(
|
|
||||||
name="setcarrierstate",
|
|
||||||
# guild_ids=[401372086746087425],
|
|
||||||
description= "Sets a carrier state on the sheet"
|
|
||||||
)
|
|
||||||
@option("carrier", description="The carrier you want to edit", autocomplete=getCarriers)
|
|
||||||
@option("state",required=True, description="The carrier you want to edit", choices=["Loading","Unloading","Full","Empty","Inactive"])
|
|
||||||
async def setCarrierState(ctx, carrier, state):
|
|
||||||
response = await getFromSheet(gsheetToken, "carrier")
|
|
||||||
carrierState = await parseCarrierState(response)
|
|
||||||
author = str(ctx.author)
|
|
||||||
|
|
||||||
newCarrierState = []
|
|
||||||
|
|
||||||
#print(f"requested values: {carrier} to {state}")
|
|
||||||
|
|
||||||
#print(f"current values : {carrierState}")
|
|
||||||
|
|
||||||
for carrierS, stateS in carrierState:
|
|
||||||
if carrier == carrierS:
|
|
||||||
newCarrierState.append((carrier,state))
|
|
||||||
else:
|
|
||||||
newCarrierState.append((carrierS,stateS))
|
|
||||||
|
|
||||||
#print(f"new values : {newCarrierState}")
|
|
||||||
|
|
||||||
rawState = await toRawState(newCarrierState)
|
|
||||||
|
|
||||||
#print(rawState)
|
|
||||||
|
|
||||||
await ctx.defer()
|
|
||||||
i = 1
|
|
||||||
text = "Current Carrier State : \n"
|
|
||||||
|
|
||||||
|
|
||||||
data = {
|
|
||||||
"postType":"carrier",
|
|
||||||
"carrierState": rawState
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
response = await postToSheet(data, gsheetToken)
|
|
||||||
if response == 200:
|
|
||||||
await ctx.followup.send(f"The carrier {carrier} has been set to {state}")
|
|
||||||
print(f"{author} set {carrier} state to {state}")
|
|
||||||
channel = bot.get_channel(1521963883018063882)
|
|
||||||
await channel.send(f"{author} set {carrier} state to {state}")
|
|
||||||
|
|
||||||
else:
|
|
||||||
await ctx.followup.send(f"i fucked up ")
|
|
||||||
except Exception as e:
|
|
||||||
await ctx.followup.send(f"help : Error: {e}")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#writes to the whats left to haul channel ever 60 seconds about.. the stuff left to haul.
|
|
||||||
#also updates the current commodity List
|
|
||||||
@tasks.loop(seconds=60)
|
|
||||||
async def writeToWhatsLeftToHaul():
|
|
||||||
|
|
||||||
|
|
||||||
response = await getFromSheet(gsheetToken, "commodity")
|
|
||||||
|
|
||||||
|
|
||||||
commodity, values, initial = response.split("|")
|
|
||||||
|
|
||||||
commodity = commodity.split(",")
|
|
||||||
values = values.split(",")
|
|
||||||
initial = initial.split(",")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
values = [int(i) for i in values]
|
|
||||||
initial = [int (i) for i in initial]
|
|
||||||
|
|
||||||
|
|
||||||
finalDict = {}
|
|
||||||
progressDict = {}
|
|
||||||
neededCommodity = []
|
|
||||||
|
|
||||||
for i in range(len(commodity)):
|
|
||||||
finalDict[commodity[i]] = values[i]
|
|
||||||
if initial[i] > 0:
|
|
||||||
progressDict[commodity[i]] = await createProgressBar(values[i],initial[i])
|
|
||||||
neededCommodity.append(commodity[i])
|
|
||||||
else:
|
|
||||||
progressDict[commodity[i]] = await createProgressBar(1,1)
|
|
||||||
|
|
||||||
#finalDict = dict(sorted(finalDict.items(), key=lambda item: item[1], reverse=True))
|
|
||||||
|
|
||||||
with open("commodity.needed",'w') as f:
|
|
||||||
f.write(str(neededCommodity))
|
|
||||||
print("values set")
|
|
||||||
|
|
||||||
channel = bot.get_channel(1519457137234022460)
|
|
||||||
# await channel.purge(limit=1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
embed = discord.Embed(title="Estimated remaining amounts",
|
|
||||||
colour=discord.Colour(0xffdd55),
|
|
||||||
timestamp=datetime.now())
|
|
||||||
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
|
||||||
|
|
||||||
embed2 = discord.Embed(title="Current progress",
|
|
||||||
colour=discord.Colour(0x002f80),
|
|
||||||
timestamp=datetime.now())
|
|
||||||
embed2.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
|
||||||
|
|
||||||
|
|
||||||
for key in finalDict:
|
|
||||||
if finalDict[key] > 0:
|
|
||||||
embed.add_field(name=key, value=finalDict[key], inline=True)
|
|
||||||
embed2.add_field(name=key, value=str(progressDict[key]), inline=True)
|
|
||||||
|
|
||||||
|
|
||||||
embed2.set_footer(text="This message updates every 60 seconds(ish). Last updated")
|
|
||||||
embed.set_author(name=u'\U0001F517 ' + stationName + u' \U0001F517',
|
|
||||||
url=stationUrl)
|
|
||||||
embed2.set_author(name=u'\U0001F517 ' + stationName + u' \U0001F517',
|
|
||||||
url=stationUrl)
|
|
||||||
|
|
||||||
|
|
||||||
channel = bot.get_channel(1519457137234022460)
|
|
||||||
found = False
|
|
||||||
async for oldmsg in channel.history(limit=2):
|
|
||||||
if oldmsg.author == bot.user:
|
|
||||||
found = True
|
|
||||||
await oldmsg.edit(embeds=[embed, embed2])
|
|
||||||
break
|
|
||||||
if not found:
|
|
||||||
await channel.send(embeds=[embed, embed2])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#writes the carriers state to... the carrier state channel. Seriously, who is writing this?
|
|
||||||
@tasks.loop(seconds=60)
|
|
||||||
async def writeTocarrierState():
|
|
||||||
response = await getInternalCarrierState()
|
|
||||||
carrierState = await parseCarrierState(response)
|
|
||||||
|
|
||||||
|
|
||||||
channel = bot.get_channel(1521596285981819101)
|
|
||||||
|
|
||||||
embed = discord.Embed(title="Carriers State",
|
|
||||||
colour=discord.Colour(0x29ac08),
|
|
||||||
timestamp=datetime.now())
|
|
||||||
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/536647643367997492.png")
|
|
||||||
embed.set_author(name=u'\U0001F517 ' + stationName + u' \U0001F517',
|
|
||||||
url=stationUrl)
|
|
||||||
|
|
||||||
embed.set_footer(text="This message updates every 60 seconds(ish). Last updated")
|
|
||||||
|
|
||||||
for carrier, state in carrierState:
|
|
||||||
embed.add_field(name=carrier, value=state, inline=True)
|
|
||||||
|
|
||||||
|
|
||||||
found = False
|
|
||||||
async for oldmsg in channel.history(limit=2):
|
|
||||||
if oldmsg.author == bot.user:
|
|
||||||
found = True
|
|
||||||
await oldmsg.edit(embed=embed)
|
|
||||||
break
|
|
||||||
if not found:
|
|
||||||
await channel.send(embed=embed)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#run the damn thing
|
#run the damn thing
|
||||||
|
|
||||||
|
|
||||||
|
bot.load_extension("cogs.IdaCogs")
|
||||||
bot.run(discordToken)
|
bot.run(discordToken)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user