Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import discord
- import asyncio
- import os
- import pickle
- import ast
- client = discord.Client()
- #startchar="!"
- @client.event
- async def on_ready():
- print('Logged in as')
- print(client.user.name)
- print(client.user.id)
- print('------')
- print('Please remember to Ctrl-C this :)')
- await client.change_presence(game=discord.Game(name=''))
- await client.change_presence(game=discord.Game(name='Type this for help'))
- @client.event
- async def on_message(message):
- helpstr="""**Cat's test bot help:**
- **{0}help** You typed this!
- **Type this for help** Or maybe this.
- **What is the command start** Print the command start.
- **Inject the command start into the following string a x** Replaces **a** with the command start in **x**.
- **strinject a x** Same as above, but shorter.
- **Inject the last message sent in ths server into the following string a x** Like the above, but with the last message instead of the command start.
- **lms a x** Same as above, but shorter.
- **{0}test** Prints your username.
- **{0}echo stuff** Say **stuff**.
- **{0}wait n x** Say **x** after **n** seconds.
- **{0}multi x;y;z;...** Says **x**,**y**,**z**...
- **{0}format a;x;y;...** Formats a with x,y... using Python 3.5's "".format() function.
- **{0}replace a b x** Replaces **a** with **b** in **x**.
- **{0}load a x** Replaces **a** with the output of the last command in **x**.
- **{0}annoy stuff** Equivalent to (**{0}echo **)\*100 **stuff**.
- **{0}say channel things** Say **things** in **channel**.
- **{0}setstart thing** Changes the **{0}** to **thing**.
- **{0}push thing** Pushes **thing** to the stack.
- **{0}pop a x** Pops something from the stack and replaces **a** with it in **x**.
- **{0}length s a x** Replaces **a** with the length of **s** in decimal in **x**.
- **{0}unlength n a x** Replaces **a** with **n** 0s in **x**.
- **{0}property id value** Sets a property of the server.
- **{0}bansimplefart** Ban SimpleArt from using the bot.
- **{0}unbansimplefart** Unban SimpleFart from using the bot even though it's a bad idea.
- **{0}bms n s** Evaluate BMS. Redirects to {0}bm1 n 0 s.
- **{0}bm1 n c s** Evaluate primitive sequence system.
- **{0}bm2 n c s** Evaluate full BM2. n must be 100 or less.
- **{0}bm2d c s** Evaluate full BM2 with n set to keep the sequence under 5 elements.
- **{0}skip** Ignore the next command in this server.
- """
- global startchars
- global target
- try:
- startchars
- except:
- try:
- with open("cifbot.txt","rb") as f:
- startchars=pickle.load(f)
- except:
- startchars={}
- try:
- startchars[str(message.server)]
- except:
- #print(startchars)
- startchars[str(message.server)]={}
- startchars[str(message.server)]["startchar"]="!"
- startchars[str(message.server)]["echolimit"]=1000
- startchars[str(message.server)]["nopings"]=False
- startchars[str(message.server)]["countservers"]=[]
- startchars[str(message.server)]["stack"]=[]
- startchars[str(message.server)]["lms"]="Heavpoot sux"
- finally:
- schars=startchars[str(message.server)]
- #print(schars)
- if "startchar" not in schars.keys():
- startchars[str(message.server)]["startchar"]="!"
- if "echolimit" not in schars.keys():
- startchars[str(message.server)]["echolimit"]=1000
- if "nopings" not in schars.keys():
- startchars[str(message.server)]["nopings"]=False
- if "countservers" not in schars.keys():
- startchars[str(message.server)]["countservers"]=[]
- if "lms" not in schars.keys():
- startchars[str(message.server)]["lms"]="Heavpoot sux"
- if "simpleban" not in schars.keys():
- startchars[str(message.server)]["simpleban"]=False
- if "bmslim" not in schars.keys():
- startchars[str(message.server)]["bmslim"]=5
- if "skip" not in schars.keys():
- startchars[str(message.server)]["skip"]=0
- startchar=startchars[str(message.server)]["startchar"]
- echolimit=startchars[str(message.server)]["echolimit"]
- nopings=startchars[str(message.server)]["nopings"]
- countservers=startchars[str(message.server)]["countservers"]
- botlord=str(message.author.name)=="CatIsFluffy"
- onlyme=False
- command=True
- if botlord:print("Botlord")
- if startchars[str(message.server)]["skip"]>0 and message.content.startswith(startchar):
- startchars[str(message.server)]["skip"]-=1
- elif (str(message.author)=="Simple_Art#1200" or (not botlord and onlyme)) and message.content.startswith(startchar) and startchars[str(message.server)]["simpleban"]:
- await client.send_message(message.channel, "Simple_Art attempted to use the bot and failed.")
- command=not onlyme
- elif message.content.startswith(startchar+'help')or message.content=="Type this for help":
- await client.send_message(message.channel, helpstr.format(startchar))
- elif message.content=="What is the command start":
- await client.send_message(message.channel, startchar)
- elif message.content[:51]=="Inject the command start into the following string "or message.content[:10]=="strinject ":
- if message.content[0]=="I":
- temp=message.content[51:].replace(" ","avdagsfz")
- else:
- temp=message.content[10:].replace(" ","avdagsfz")
- temp=temp.split(" ",1)
- temp[1]=temp[1].replace("avdagsfz"," ")
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[1].replace(temp[0],startchar),str(message.server)))
- elif message.content[:69]=="Inject the last message sent in this server into the following string "or message.content[:4]=="lms ":
- if message.content[0]=="I":
- temp=message.content[69:].replace(" ","avdagsfz")
- else:
- temp=message.content[4:].replace(" ","avdagsfz")
- temp=temp.split(" ",1)
- temp[1]=temp[1].replace("avdagsfz"," ")
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[1].replace(temp[0],startchars[str(message.server)]["lms"]),str(message.server)))
- elif message.content.startswith(startchar+'multi '):
- temp=message.content[len(startchar)+6:].replace(";;","avdagsfz")
- temp=temp.split(";")
- temp=[i.replace("avdagsfz",";") for i in temp]
- for i in temp:
- await client.send_message(message.channel, store(i,str(message.server)))
- elif message.content.startswith(startchar+'format '):
- temp=message.content[len(startchar)+7:].replace(";;","avdagsfz")
- temp=temp.split(";")
- temp=[i.replace("avdagsfz",";") for i in temp]
- await client.send_message(message.channel, store(temp[0].format(*temp[1:]),str(message.server)))
- elif message.content.startswith(startchar+'replace '):
- temp=message.content[len(startchar)+8:].replace(" ","avdagsfz")
- temp=temp.split(" ",2)
- temp[2]=temp[2].replace("avdagsfz"," ")
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[2].replace(*temp[:-1]),str(message.server)))
- elif message.content.startswith(startchar+'load '):
- temp=message.content[len(startchar)+5:].replace(" ","avdagsfz")
- temp=temp.split(" ",1)
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[1].replace(temp[0],last),str(message.server)))
- elif message.content.startswith(startchar+'test '):
- await client.send_message(message.channel, str(message.author))
- elif message.content.startswith(startchar+'wait '):
- temp=message.content.split(" ",2)
- await asyncio.sleep(int(temp[1]))
- code=check(temp[2],echolimit,nopings,startchar)
- if code==0:
- await client.send_message(message.channel, store(temp[2],str(message.server)))
- else:
- await client.send_message(message.channel, store("Invalid",str(message.server)))
- elif message.content.startswith(startchar+'echo '):
- code=check(message.content[len(startchar)+5:],echolimit,nopings,startchar)
- if code==0:
- if False and message.author=="Simple_Art#1200":
- await client.send_message(message.channel, store("Simple_Art attempted to use the bot to post anonymously and failed."))
- else:
- await client.send_message(message.channel, store(message.content[len(startchar)+5:],str(message.server)))
- else:
- await client.send_message(message.channel, store("Invalid",str(message.server)))
- elif message.content.startswith(startchar+'annoy'):
- code=check(message.content[len(startchar)+6:],echolimit,nopings,startchar)
- if code==0:
- await client.send_message(message.channel, (startchar+"echo ")*100+message.content[len(startchar)+6:])
- else:
- await client.send_message(message.channel, "Invalid")
- elif message.content.startswith(startchar+'say '):
- temp=message.content.split(" ",2)
- if temp[1][0]=="#":
- temp[1]==temp[1][1:]
- channel=discord.utils.get(message.server.channels,name=temp[1])
- print(channel,type(channel))
- await client.send_message(message.server.get_channel(channel.id), temp[2])
- elif message.content.startswith(startchar+'ssay '):
- temp=message.content.split(" ",3)
- channel=discord.utils.get(target.channels,name=temp[2])
- print(channel,type(channel))
- await client.send_message(target.get_channel(channel.id), temp[3])
- elif message.content.startswith(startchar+'sleep'):
- await asyncio.sleep(5)
- await client.send_message(message.channel, 'Done sleeping')
- elif message.content.startswith(startchar+'setstart'):
- startchars[str(message.server)]["startchar"]=message.content[len(startchar)+9:].replace("\\","").strip()
- startchar=startchars[str(message.server)]["startchar"]
- await client.send_message(message.channel, 'Command start is now '+startchar)
- elif message.content.startswith(startchar+'property '):
- temp=message.content.split(" ",2)
- startchars[str(message.server)][temp[1]]=ast.literal_eval(temp[2])
- await client.send_message(message.channel, temp[1]+'='+temp[2])
- elif message.content.startswith(startchar+'addcount'):
- pass
- elif message.content.startswith(startchar+'push'):
- temp=message.content.split(" ",1)
- startchars[str(message.server)]['stack'].append(temp[1])
- await client.send_message(message.channel, "Pushed "+temp[1])
- elif message.content.startswith(startchar+'pop '):
- temp=message.content[len(startchar)+4:]
- temp=temp.split(" ",1)
- await client.send_message(message.channel, store(temp[1].replace(temp[0],startchars[str(message.server)]['stack'].pop()),str(message.server)))
- elif message.content.startswith(startchar+'peek '):
- temp=message.content[len(startchar)+4:]
- temp=temp.split(" ",1)
- await client.send_message(message.channel, store(temp[1].replace(temp[0],startchars[str(message.server)]['stack'][-1]),str(message.server)))
- elif message.content.startswith(startchar+'length '):
- temp=message.content[len(startchar)+7:].replace(" ","avdagsfz")
- temp=temp.split(" ",2)
- temp[2]=temp[2].replace("avdagsfz"," ")
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[2].replace(temp[1],str(len(temp[0]))),str(message.server)))
- elif message.content.startswith(startchar+'unlength'):
- temp=message.content[len(startchar)+9:].replace(" ","avdagsfz")
- temp=temp.split(" ",2)
- temp[2]=temp[2].replace("avdagsfz"," ")
- temp=[i.replace("avdagsfz"," ") for i in temp]
- await client.send_message(message.channel, store(temp[2].replace(temp[1],"0"*int(temp[0])),str(message.server)))
- elif message.content.startswith(startchar+'shell ') and botlord:
- out=os.popen(message.content[len(startchar)+6:]).read()
- print(out)
- await client.send_message(message.channel, "Executing "+message.content[len(startchar)+6:])
- if len(out)>2000:
- await client.send_message(message.channel, "Output too long :(")
- elif out=="":
- await client.send_message(message.channel, "No output.")
- else:
- await client.send_message(message.channel, "Shell output:")
- await client.send_message(message.channel, escape(out))
- elif message.content.startswith(startchar+'target') and botlord:
- target=message.server
- elif message.content.startswith(startchar+'restore ') and botlord:
- startchars=ast.literal_eval(message.content[len(startchar)+8:])
- print("Now",startchars)
- await client.send_message(message.channel, "Startchars is now "+str(startchars))
- elif message.content.startswith(startchar+'shutdown') and botlord:
- await client.send_message(message.channel, "Restore dump is "+str(startchars))
- exit(0)
- elif message.content.startswith(startchar+'bansimplefart'):
- startchars[str(message.server)]['simpleban']=True
- elif message.content.startswith(startchar+'unbansimplefart'):
- startchars[str(message.server)]['simpleban']=False
- elif message.content.startswith(startchar+'bms '):
- temp=message.content.split(" ",2)
- await client.send_message(message.channel,startchar+"bm2 "+temp[1]+" 0 "+temp[2])
- elif message.content.startswith(startchar+'bm1 '):
- temp=message.content.split(" ",3)
- n=int(temp[1])
- c=int(temp[2])
- s=list(map(int,temp[3].replace(")","").split("(")[1:]))
- if len(s)==0:
- return
- l=s.pop()
- if l>0:
- p=len(s)-1
- print(s,l)
- while l<=s[p]:
- print(",",p,s[p])
- p-=1
- if n==0:
- s=s[:p]
- else:
- for i in range(1,n):
- s+=s[p:]
- else:
- c+=1
- await client.send_message(message.channel,startchar+"bm1 "+str(n)+" "+str(c)+" "+"".join(list(map(lambda x:"("+str(x)+")",s))))
- elif message.content.startswith(startchar+'bm2 '):
- temp=message.content.split(" ",3)
- await client.send_message(message.channel,bash(int(temp[1]),int(temp[2]),temp[3],startchars[str(message.server)]["bmslim"]))
- elif message.content.startswith(startchar+'bm2d '):
- temp=message.content.split(" ",2)
- await client.send_message(message.channel,bash(-1,int(temp[1]),temp[2],startchars[str(message.server)]["bmslim"]))
- elif message.content.startswith(startchar+'bm2d2 '):
- temp=message.content.split(" ",3)
- await client.send_message(message.channel,bash(-2,int(temp[2]),temp[3],int(temp[1])))
- elif message.content.startswith(startchar+'bm2d3 '):
- temp=message.content.split(" ",3)
- await client.send_message(message.channel,bash(-3,int(temp[2]),temp[3],int(temp[1])))
- elif message.content.startswith(startchar+'chms '):
- temp=message.content.split(" ",3)
- await client.send_message(message.channel,chms(int(temp[1]),int(temp[2]),temp[3],startchars[str(message.server)]["bmslim"]))
- elif message.content.startswith(startchar+'chmsd2 '):
- temp=message.content.split(" ",3)
- await client.send_message(message.channel,chms(-2,int(temp[2]),temp[3],int(temp[1])))
- elif message.content.startswith(startchar+'skip'):
- startchars[str(message.server)]["skip"]+=1
- elif message.content.startswith(startchar+'something '):
- temp=message.content[len(startchar)+10:]
- starts=[]
- start=-1
- end=-1
- detect=0
- for i in range(len(temp)):
- if temp[i]=="(":
- starts.append(i)
- detect=0
- elif temp[i]==")":
- start=starts.pop()
- detect=1
- elif temp[i] in "^:!" and detect:
- end=i-1
- break
- ret=""
- if end>-1:
- if temp[end+1]=="^":
- ret=temp[:start]+temp[start+1:end]+temp[end+2:]
- elif temp[end+1]=="!":
- ret=temp[:start]+temp[end+2:]
- elif temp[end+1]==":":
- ret=temp[:end+1]+temp[start:end+1]+temp[end+2:]
- await client.send_message(message.channel,startchar+'something '+ret)
- else:
- command=False
- if command:
- #print(startchars,end="\n\n")
- print("In:",message.server,message.channel)
- print("By:",message.author)
- print("Is:",message.content)
- startchars[str(message.server)]["lms"]=message.content
- print(message.content)
- def bash(n,t,s,lim=5):
- def seqred(s2,li,trigger):
- nonlocal rows
- d=[False]*len(s2)
- for i in range(rows):
- x=s2[li]
- for j in range(li-1,-1,-1):
- if d[j]:
- continue
- y=s2[j]
- if y[i]<x[i]:
- x=y
- else:
- d[j]=True
- if j==trigger:
- return i
- if trigger>-1:
- return rows
- return d
- if n>10:
- n=10
- s=s.replace("(","").split(")")[:-1]
- if len(s)==0:
- return
- s2=[]
- if s[0]=="":
- s2=[[]]*len(s)
- else:
- for i in s:
- l=list(map(int,i.split(",")))
- s2.append(l)
- l=s2[-1]
- lim2=lim
- if l[0]>0:
- rows=len(l)
- while l[rows-1]==0:
- rows-=1
- d=seqred(s2,len(s2)-1,-1)
- bri=-1
- for i in range(len(s2)-2,-1,-1):
- if not d[i]:
- bri=i
- break
- if n<0:
- print(lim)
- lim-=bri
- print(lim)
- lim//=len(s2)-bri-1
- print(lim)
- n2=lim
- if n==-3:
- n2=10
- else:
- n2=n
- if n2>0:
- br=s2[bri]
- dt=[(v[0]-v[1] if i<rows-1 else 0)for i,v in enumerate(zip(l,br))]
- #c=[[1]*len(l)]
- c=[]
- for i in range(bri,len(s2)-1):
- r=seqred(s2,i,bri)
- c.append([(1 if i<r else 0) for i in range(0,len(l))])
- sx=[s2[bri:-1]]
- for i in range(1,n2):
- sx.append([[y+x*z for x,y,z in zip(c[i],v,dt)] for i,v in enumerate(sx[-1])])
- s2=s2[:-1]
- for i in range(1,n2):
- s2+=sx[i]
- else:
- s2=s2[:bri]
- if t<-1:
- t+=1
- else:
- s2=s2[:-1]
- t+=1
- if n==-3:
- s2=s2[:lim2]
- print(str(t)+":"+str(s2))
- shrink=len(s2) and len(s2[0])>1
- for i in s2:
- if i[-1]!=0:
- shrink=False
- break
- if shrink:
- s2=[i[:-1] for i in s2]
- s3=["("+",".join([str(y) for y in x])+")" for x in s2]
- prefix="!bm2"
- if t==-1:
- prefix=""
- if n==-1:
- return prefix+"d "+str(t)+" "+"".join(s3)
- elif n==-2:
- return prefix+"d2 "+str(lim2)+" "+str(t)+" "+"".join(s3)
- elif n==-3:
- return prefix+"d3 "+str(lim2)+" "+str(t)+" "+"".join(s3)
- return prefix+" "+str(n)+" "+str(t)+" "+"".join(s3)
- def chms(n,t,s,lim=5):
- def seqred(s2,li,trigger):
- nonlocal rows
- d=[False]*len(s2)
- for i in range(rows):
- x=s2[li]
- for j in range(li-1,-1,-1):
- if d[j]:
- continue
- y=s2[j]
- if y[i]<x[i]:
- x=y
- else:
- d[j]=True
- if j==trigger:
- return i
- if trigger>-1:
- return rows
- return d
- if n>10:
- n=10
- s=s.replace("(","").split(")")[:-1]
- if len(s)==0:
- return
- s2=[]
- if s[0]=="":
- s2=[[]]*len(s)
- else:
- for i in s:
- l=list(map(int,i.split(",")))
- s2.append(l)
- l=s2[-1]
- lim2=lim
- if l[0]>0:
- rows=len(l)
- while l[rows-1]==0:
- rows-=1
- d=seqred(s2,len(s2)-1,-1)
- bri=-1
- for i in range(len(s2)-2,-1,-1):
- if not d[i]:
- bri=i
- break
- if n<0:
- print(lim)
- lim-=bri
- print(lim)
- lim//=len(s2)-bri-1
- print(lim)
- n2=lim
- if n==-3:
- n2+=1
- else:
- n2=n
- if n2>0:
- br=s2[bri]
- dt=[(v[0]-v[1] if i<rows-1 else 0)for i,v in enumerate(zip(l,br))]
- dt[rows-1]=l[rows-1]-br[rows-1]-1
- #c=[[1]*len(l)]
- c=[]
- for i in range(bri,len(s2)-1):
- r=seqred(s2,i,bri)
- c.append([(1 if i<r else 0) for i in range(0,len(l))])
- sx=[s2[bri:-1]]
- for i in range(1,n2**2):
- sx.append([[y+x*z for x,y,z in zip(c[i],v,dt)] for i,v in enumerate(sx[-1])])
- s2=s2[:-1]
- c=0
- print(",",dt[rows-1],bri,len(s2))
- strange=dt[rows-1]==0 and bri==len(s2)-1
- for i in range(1,n2):
- if strange:
- c+=i
- else:
- c+=1
- s2+=sx[c]
- else:
- s2=s2[:bri]
- if t<-1:
- t+=1
- else:
- s2=s2[:-1]
- t+=1
- if n==-3:
- s2=s2[:lim]
- print(str(t)+":"+str(s2))
- shrink=len(s2) and len(s2[0])>1
- for i in s2:
- if i[-1]!=0:
- shrink=False
- break
- if shrink:
- s2=[i[:-1] for i in s2]
- s3=["("+",".join([str(y) for y in x])+")" for x in s2]
- prefix="!chms"
- if t==-1:
- prefix=""
- if n==-1:
- return prefix+"d "+str(t)+" "+"".join(s3)
- elif n==-2:
- return prefix+"d2 "+str(lim2)+" "+str(t)+" "+"".join(s3)
- elif n==-3:
- return prefix+"d3 "+str(lim2)+" "+str(t)+" "+"".join(s3)
- return prefix+" "+str(n)+" "+str(t)+" "+"".join(s3)
- def check(message,limit,nopings,start):
- looping=message.count(start+"echo")+message.count(start+"say")+message.count(start+"ssay")+message.count(start+"annoy")+message.count(start+"wait")+message.count(start+"format")+message.count(start+"replace")+message.count(start+"load")>limit
- pings=message.count("@") and nopings
- output=0
- if looping:output+=1
- if pings:output+=2
- return output
- def escape(x):
- return x.replace("*","\\*").replace("_","\\_").replace("@","\\@")
- def store(x,s):
- global last
- last=x
- startchars[s]["lms"]=x
- return last
- try:
- #client.run('SimplefArtsucksSimplefArtsucks')
- client.run('SimplefArtsucksSimplefArtsucks')
- except KeyboardInterrupt:
- with open("cifbot.txt","w") as f:
- print(startchars)
- pickle.dump(startchars,f,pickle.HIGHEST_PROTOCOL)
- print("Dump complete")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement