2017-09-24 15:05:28 +00:00
import asyncio
2017-10-11 07:01:13 +00:00
import datetime as dt
2017-10-02 19:24:34 +00:00
import mimetypes
import os
import tempfile
2017-10-13 02:27:21 +00:00
import traceback as tb
2017-10-02 19:24:34 +00:00
import webbrowser
2017-10-13 02:27:21 +00:00
import discord
import httplib2
import requests_oauthlib as ro
from apiclient import http
from apiclient . discovery import build
2017-09-24 15:05:28 +00:00
from discord . ext import commands
2017-10-13 02:27:21 +00:00
from oauth2client . client import flow_from_clientsecrets
2017-10-11 07:01:13 +00:00
#from run import config
2017-09-24 15:05:28 +00:00
from cogs import booru
from misc import exceptions as exc
2017-10-13 02:27:21 +00:00
from misc import checks
from utils import utils as u
2017-09-24 15:05:28 +00:00
from utils import formatter
2017-10-11 07:01:13 +00:00
youtube = None
2017-10-02 19:24:34 +00:00
2017-10-11 07:01:13 +00:00
tempfile . tempdir = os . getcwd ( )
2017-10-02 19:24:34 +00:00
command_dict = { }
2017-10-13 02:27:21 +00:00
2017-09-24 15:05:28 +00:00
class Utils :
2017-10-20 20:26:13 +00:00
def __init__ ( self , bot ) :
self . bot = bot
2017-10-17 23:04:45 +00:00
2017-10-20 20:26:13 +00:00
@commands.command ( name = ' last ' , aliases = [ ' l ' , ' , ' ] , brief = ' Reinvokes last command ' , description = ' Reinvokes previous command executed ' , hidden = True )
async def last_command ( self , ctx ) :
global command_dict
2017-10-17 23:04:45 +00:00
2017-10-20 20:26:13 +00:00
if command_dict . get ( str ( ctx . author . id ) , { } ) . get ( ' args ' , None ) is not None :
args = command_dict . get ( str ( ctx . author . id ) , { } ) [ ' args ' ]
print ( command_dict )
await ctx . invoke ( command_dict . get ( str ( ctx . author . id ) , { } ) . get ( ' command ' , None ) , args )
2017-10-17 23:04:45 +00:00
2017-10-20 20:26:13 +00:00
# Displays latency
@commands.command ( aliases = [ ' p ' ] , brief = ' Pong! ' , description = ' Returns latency from bot to Discord servers, not to user ' )
@checks.del_ctx ( )
async def ping ( self , ctx ) :
global command_dict
2017-10-17 23:04:45 +00:00
2017-10-30 04:20:40 +00:00
await ctx . message . add_reaction ( ' 🏓 ' )
2017-10-17 23:04:45 +00:00
2017-10-30 04:20:40 +00:00
await ctx . send ( ctx . author . mention + ' 🏓 ` ' + str ( round ( self . bot . latency * 1000 ) ) + ' ms` ' , delete_after = 5 )
2017-10-20 20:26:13 +00:00
command_dict . setdefault ( str ( ctx . author . id ) , { } ) . update ( { ' command ' : ctx . command } )
2017-10-17 23:04:45 +00:00
2017-10-20 20:26:13 +00:00
@commands.command ( aliases = [ ' pre ' ] , brief = ' List bot prefixes ' , description = ' Shows all used prefixes ' )
@checks.del_ctx ( )
async def prefix ( self , ctx ) :
2017-10-20 20:25:40 +00:00
await ctx . send ( ' **Prefix:** ` {} ` ' . format ( ' ` or ` ' . join ( u . settings [ ' prefixes ' ] [ ctx . guild . id ] if ctx . guild . id in u . settings [ ' prefixes ' ] else u . config [ ' prefix ' ] ) ) )
2017-10-30 04:20:40 +00:00
await ctx . message . add_reaction ( ' ✅ ' )
2017-10-20 20:26:13 +00:00
@commands.group ( name = ' ,send ' , aliases = [ ' ,s ' ] , hidden = True )
@commands.is_owner ( )
@checks.del_ctx ( )
async def send ( self , ctx ) :
pass
@send.command ( name = ' guild ' , aliases = [ ' g ' , ' server ' , ' s ' ] )
async def send_guild ( self , ctx , guild , channel , * , message ) :
await discord . utils . get ( self . bot . get_all_channels ( ) , guild_name = guild , name = channel ) . send ( message )
await ctx . message . add_reaction ( ' \N{WHITE HEAVY CHECK MARK} ' )
@send.command ( name = ' user ' , aliases = [ ' u ' , ' member ' , ' m ' ] )
async def send_user ( self , ctx , user , * , message ) :
await discord . utils . get ( self . bot . get_all_members ( ) , id = int ( user ) ) . send ( message )
await ctx . message . add_reaction ( ' \N{WHITE HEAVY CHECK MARK} ' )
@commands.command ( aliases = [ ' authenticateupload ' , ' authupload ' , ' authup ' , ' auth ' ] )
async def authenticate_upload ( self , ctx ) :
global youtube
flow = flow_from_clientsecrets ( ' client_secrets.json ' , scope = ' https://www.googleapis.com/auth/youtube.upload ' ,
login_hint = ' botmyned@gmail.com ' , redirect_uri = ' urn:ietf:wg:oauth:2.0:oob ' )
flow . params [ ' access_type ' ] = ' offline '
webbrowser . open_new_tab ( flow . step1_get_authorize_url ( ) )
credentials = flow . step2_exchange ( input ( ' Authorization code: ' ) )
youtube = build ( ' youtube ' , ' v3 ' , http = credentials . authorize ( http . build_http ( ) ) )
print ( ' Service built. ' )
@commands.command ( aliases = [ ' up ' , ' u ' , ' vid ' , ' v ' ] )
@commands.has_permissions ( administrator = True )
async def upload ( self , ctx ) :
global youtube
attachments = ctx . message . attachments
try :
if not attachments :
raise exc . MissingAttachment
if len ( attachments ) > 1 :
raise exc . TooManyAttachments ( len ( attachments ) )
mime = mimetypes . guess_type ( attachments [ 0 ] . filename ) [ 0 ]
if ' video/ ' in mime :
with tempfile . NamedTemporaryFile ( ) as temp :
await attachments [ 0 ] . save ( temp )
else :
raise exc . InvalidVideoFile ( mime )
print ( ' https://www.youtube.com/watch?v= ' + youtube . videos ( ) . insert ( part = ' snippet ' ,
body = { ' categoryId ' : ' 24 ' , ' title ' : ' Test ' } , media_body = http . MediaFileUpload ( temp . name , chunksize = - 1 ) ) )
except exc . InvalidVideoFile as e :
2017-10-28 20:28:16 +00:00
await ctx . send ( ' ` ' + str ( e ) + ' ` **invalid video type** ' , delete_after = 10 )
2017-10-20 20:26:13 +00:00
except exc . TooManyAttachments as e :
await ctx . send ( ' ` ' + str ( e ) + ' ` **too many attachments.** Only one attachment is permitted to upload. ' , delete_after = 10 )
except exc . MissingAttachment :
2017-10-28 20:28:16 +00:00
await ctx . send ( ' **Missing attachment** ' , delete_after = 10 )
2017-10-20 20:26:13 +00:00
@upload.error
async def upload_error ( self , ctx , error ) :
pass
2017-10-11 07:01:13 +00:00
# http.