initial commit

This commit is contained in:
2017-06-02 18:05:21 +02:00
commit ce3df46993
19 changed files with 504 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# Add any directories, files, or patterns you don't want to be tracked by version control
+27
View File
@@ -0,0 +1,27 @@
import asyncio
import discord
from discord.ext import commands
from sympy import latex, symbols, preview, Symbol #for LaTeX images
class General(object):
"""Overal toegestaan."""
def __init__(self, bot):
self.bot = bot
self.voice_states = {}
def __check(self, ctx): #Todo: Is dit het porno kanaal?
return True
@commands.command(pass_context=True)
@asyncio.coroutine
def tex(self, ctx, mathstring):
"""Geeft een mooi LaTeX plaatje terug.
Encapsuleer uw string in mooie \"
Bijvoorbeeld:
!tex "a^b b^c \rightarrow d"
"""
preamble = "\\documentclass[10pt]{article}\\pagestyle{empty}\\usepackage[margin=1in]{geometry}\\usepackage[T1]{fontenc}\\usepackage{CJKutf8}\\usepackage[english]{babel}\\usepackage{amsmath, amsfonts}\\begin{document}"
options = ["-T", "tight", "-z", "9", "--truecolor", "-D", "512"]
preview(r'$$'+mathstring+'$$', viewer='file', filename='test.png', dvioptions=options, preamble=preamble)
file = open('test.png', 'rb')
yield from self.bot.upload(file, filename ='test.png', content='Nerd!')
+240
View File
@@ -0,0 +1,240 @@
import asyncio
import discord
from discord.ext import commands
class VoiceEntry:
def __init__(self, message, player):
self.requester = message.author
self.channel = message.channel
self.player = player
def __str__(self):
fmt = '*{0.title}* verzocht door {1.display_name}'
duration = self.player.duration
if duration:
fmt = fmt + ' [{0[0]}m {0[1]}s]'.format(divmod(duration, 60))
return fmt.format(self.player, self.requester)
class VoiceState:
def __init__(self, bot):
self.current = None
self.voice = None
self.bot = bot
self.play_next_song = asyncio.Event()
self.songs = asyncio.Queue()
self.skip_votes = set() # a set of user_ids that voted
self.audio_player = self.bot.loop.create_task(self.audio_player_task())
def is_playing(self):
if self.voice is None or self.current is None:
return False
player = self.current.player
return not player.is_done()
@property
def player(self):
return self.current.player
def skip(self):
self.skip_votes.clear()
if self.is_playing():
self.player.stop()
def toggle_next(self):
self.bot.loop.call_soon_threadsafe(self.play_next_song.set)
@asyncio.coroutine
def audio_player_task(self):
while True:
self.play_next_song.clear()
self.current = yield from self.songs.get()
yield from self.bot.send_message(self.current.channel, 'U luistert naar: ' + str(self.current))
self.current.player.start()
yield from self.play_next_song.wait()
if not discord.opus.is_loaded():
# the 'opus' library here is opus.dll on windows
# or libopus.so on linux in the current directory
# you should replace this with the location the
# opus library is located in and with the proper filename.
# note that on windows this DLL is automatically provided for you
discord.opus.load_opus('opus')
class Music:
"""Play that funky music white boy.
"""
def __init__(self, bot):
self.bot = bot
self.voice_states = {}
def __check(self, ctx):
return True
def get_voice_state(self, server):
state = self.voice_states.get(server.id)
if state is None:
state = VoiceState(self.bot)
self.voice_states[server.id] = state
return state
@asyncio.coroutine
def create_voice_client(self, channel):
voice = yield from self.bot.join_voice_channel(channel)
state = self.get_voice_state(channel.server)
state.voice = voice
def __unload(self):
for state in self.voice_states.values():
try:
state.audio_player.cancel()
if state.voice:
self.bot.loop.create_task(state.voice.disconnect())
except:
pass
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def join(self, ctx, *, channel : discord.Channel):
"""Verplaats stroopie naar een bepaald kanaal."""
try:
yield from self.create_voice_client(channel)
except discord.ClientException:
yield from self.bot.say('Already in a voice channel...')
except discord.InvalidArgument:
yield from self.bot.say('This is not a voice channel...')
else:
yield from self.bot.say('Ready to play audio in ' + channel.name)
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def summon(self, ctx):
"""Roep stroopie naar jouw kanaal toe.."""
summoned_channel = ctx.message.author.voice_channel
if summoned_channel is None:
yield from self.bot.say('You are not in a voice channel.')
return False
state = self.get_voice_state(ctx.message.server)
if state.voice is None:
state.voice = yield from self.bot.join_voice_channel(summoned_channel)
else:
yield from state.voice.move_to(summoned_channel)
return True
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def play(self, ctx, *, song : str):
"""Zet een liedje in de queue
"""
state = self.get_voice_state(ctx.message.server)
opts = {
'default_search': 'auto',
'quiet': True,
'no-check-certificate': True,
}
if state.voice is None:
success = yield from ctx.invoke(self.summon)
if not success:
return
try:
player = yield from state.voice.create_ytdl_player(song, ytdl_options=opts, after=state.toggle_next)
except Exception as e:
fmt = 'Error: ```py\n{}: {}\n```'
yield from self.bot.send_message(ctx.message.channel, fmt.format(type(e).__name__, e))
else:
player.volume = 0.6
entry = VoiceEntry(ctx.message, player)
yield from self.bot.say('In de queue: ' + str(entry))
yield from state.songs.put(entry)
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def volume(self, ctx, value : int):
"""zet het volume. 1-100"""
state = self.get_voice_state(ctx.message.server)
if state.is_playing():
player = state.player
player.volume = value / 100
yield from self.bot.say('Zet het volume op {:.0%}'.format(player.volume))
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def pause(self, ctx):
"""Pauzeer het huidige liedje"""
state = self.get_voice_state(ctx.message.server)
if state.is_playing():
player = state.player
player.pause()
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def resume(self, ctx):
"""onpauzeer."""
state = self.get_voice_state(ctx.message.server)
if state.is_playing():
player = state.player
player.resume()
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def stop(self, ctx):
"""Kappen nou. Stoppen met spelen, gaat uit het kanaal en leegt de queue.
"""
server = ctx.message.server
state = self.get_voice_state(server)
if state.is_playing():
player = state.player
player.stop()
try:
state.audio_player.cancel()
del self.voice_states[server.id]
yield from state.voice.disconnect()
except:
pass
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def skip(self, ctx):
"""skipperdepip
"""
state = self.get_voice_state(ctx.message.server)
if not state.is_playing():
yield from self.bot.say('Not playing any music right now...')
return
voter = ctx.message.author
if voter == state.current.requester:
yield from self.bot.say('Requester requested skipping song...')
state.skip()
elif voter.id not in state.skip_votes:
state.skip_votes.add(voter.id)
total_votes = len(state.skip_votes)
if total_votes >= 3:
yield from self.bot.say('Skip vote passed, skipping song...')
state.skip()
else:
yield from self.bot.say('Skip vote added, currently at [{}/3]'.format(total_votes))
else:
yield from self.bot.say('You have already voted to skip this song.')
@commands.command(pass_context=True, no_pm=True)
@asyncio.coroutine
def playing(self, ctx):
"""Info over het huidige liedje."""
state = self.get_voice_state(ctx.message.server)
if state.current is None:
yield from self.bot.say('Not playing anything.')
else:
skip_count = len(state.skip_votes)
yield from self.bot.say('Now playing {} [skips: {}/3]'.format(state.current, skip_count))
+36
View File
@@ -0,0 +1,36 @@
import asyncio
import discord
from discord.ext import commands
import os
from random import randint
class Porno(object):
"""Porno commando's. Jij weet wat er aan is."""
def __init__(self, bot):
self.bot = bot
self.voice_states = {}
self.fileIndex = {}
def __check(self, ctx): #Todo: Is dit het porno kanaal?
return True
def randomJpgFromFolder(self, dir):
if dir not in self.fileIndex.keys():
self.fileIndex[dir] = [] #empty list
for dirname, dirnames, filenames in os.walk('./'+ dir):
for filename in filenames:
if filename.endswith('.jpg'):
self.fileIndex[dir].append(os.path.join(dirname, filename))
#now we should have an index for the selected folder, but it might still be empty (i.e. empty folder given)
if self.fileIndex[dir]:
return self.fileIndex[dir][randint(0,len(self.fileIndex[dir])-1)] #get a random element from the newly created index
else:
return 'default file here'
@commands.command(pass_context=True)
@asyncio.coroutine
def ancilla(self, ctx):
""" :-) """
filepath = self.randomJpgFromFolder('ancilla');
file = open(filepath, 'rb')
yield from self.bot.upload(file, filename = filepath, content='Alsjeblieft!')
+29
View File
@@ -0,0 +1,29 @@
# README #
This README would normally document whatever steps are necessary to get your application up and running.
### What is this repository for? ###
* Quick summary
* Version
* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
### How do I get set up? ###
* Summary of set up
* Configuration
* Dependencies
* Database configuration
* How to run tests
* Deployment instructions
### Contribution guidelines ###
* Writing tests
* Code review
* Other guidelines
### Who do I talk to? ###
* Repo owner or admin
* Other community or team contact
+72
View File
@@ -0,0 +1,72 @@
import asyncio
import discord
from discord.ext import commands
from urllib import request
import json, requests
from datetime import datetime
import sys
import os
class Shitpost(object):
"""Schijtpaal commando's. Alleen bruikbaar in de daarvoor toegewezen schijtpaal kanalen."""
def __init__(self, bot):
self.bot = bot
self.voice_states = {}
def __check(self, ctx): #Todo: Is dit het shitpost kanaal?
return True
@commands.command(pass_context=True)
@asyncio.coroutine
def eriku(self, ctx, boven: str, onder: str):
"""Maakt een erik meem.
Bijvoorbeeld:
@Stroopwafel eriku \"je moeder\" \"is een hoer\"
"""
params = dict(
template_id = '93296473', #de eriku
username = 'Stroopwafel',
password = 'ruyter118',
text0 = boven,
text1 = onder
)
self.bot.say("deed ik het ding?")
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
#todo check for success
photourl = resp.json()['data']['url']
em = discord.Embed(title='De Eriku heeft gesproken. Prijs hem!', type='photo')
em.set_image(url=photourl)
yield from self.bot.say(embed=em)
@commands.command(pass_context=True, hidden=True)
@asyncio.coroutine
def nihao(self,ctx):
yield from self.bot.say("Kankerlauw")
@commands.command(pass_context=True)
@asyncio.coroutine
def tijd(self, ctx, *args):
"""Vertelt je hoe laat het is..
Misschien geeft het ook wel een leuke meem terug.
Wie weet.
Probeer het eens op verschillende tijdstippen
"""
time=datetime.now().strftime('%H%M')
for argument in args:
time = argument
filepath = ''
#filejpg = './tijd/' + time + '.jpg'
#filepng = './tijd/' + time + '.png'
filejpg = os.path.join('tijd', time) + '.jpg'
filepng = os.path.join('tijd', time) + '.png'
if os.path.isfile(filejpg):
filepath = filejpg
elif os.path.isfile(filepng):
filepath = filepng
if filepath is not '':
file = open(filepath, 'rb')
yield from self.bot.upload(file, filename = filepath)
else:
yield from self.bot.say('Het is nu ' + datetime.now().strftime('%H:%M'))
+20
View File
@@ -0,0 +1,20 @@
import asyncio
import discord
import Music
import Porno
import Shitpost
import General
from discord.ext import commands
bot = commands.Bot(command_prefix=commands.when_mentioned_or('!'), description='Stroopwafel. Shitpost bot extraordinaire.', pm_help=True)
bot.add_cog(Music.Music(bot))
bot.add_cog(Shitpost.Shitpost(bot))
bot.add_cog(Porno.Porno(bot))
bot.add_cog(General.General(bot))
@bot.event
@asyncio.coroutine
def on_ready():
print('Logged in as:\n{0} (ID: {0.id})'.format(bot.user))
bot.run('MjczODc1ODM1NzIxNzQ0Mzg1.C2p7EA._tTMtYEsaUuTv_RtOifGhNX9QZ4')
+59
View File
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>6f25512f-caba-45b1-9b6a-d2d28b32494a</ProjectGuid>
<ProjectHome>.</ProjectHome>
<StartupFile>Stroopwafel.py</StartupFile>
<SearchPath>
</SearchPath>
<WorkingDirectory>.</WorkingDirectory>
<OutputPath>.</OutputPath>
<Name>Stroopwafel</Name>
<RootNamespace>Stroopwafel</RootNamespace>
<IsWindowsApplication>False</IsWindowsApplication>
<InterpreterId>{257fd04c-048c-4bcb-bc47-024b035ececc}</InterpreterId>
<InterpreterVersion>3.5</InterpreterVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>true</DebugSymbols>
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
</PropertyGroup>
<ItemGroup>
<Compile Include="General.py">
<SubType>Code</SubType>
</Compile>
<Compile Include="Porno.py">
<SubType>Code</SubType>
</Compile>
<Compile Include="Shitpost.py">
<SubType>Code</SubType>
</Compile>
<Compile Include="Stroopwafel.py" />
<Compile Include="Music.py">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<InterpreterReference Include="{257fd04c-048c-4bcb-bc47-024b035ececc}\3.5" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<PtvsTargetsFile>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets</PtvsTargetsFile>
</PropertyGroup>
<Import Condition="Exists($(PtvsTargetsFile))" Project="$(PtvsTargetsFile)" />
<Import Condition="!Exists($(PtvsTargetsFile))" Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
<!-- Uncomment the CoreCompile target to enable the Build command in
Visual Studio and specify your pre- and post-build commands in
the BeforeBuild and AfterBuild targets below. -->
<!--<Target Name="CoreCompile" />-->
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
</Project>
+20
View File
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "Stroopwafel", "Stroopwafel.pyproj", "{6F25512F-CABA-45B1-9B6A-D2D28B32494A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6F25512F-CABA-45B1-9B6A-D2D28B32494A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F25512F-CABA-45B1-9B6A-D2D28B32494A}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB