2018-06-20 10:51:58 +00:00
#!/usr/bin/env python3
import irc . bot
import gitea , github
import markovuniverse as mu
2018-06-20 11:20:36 +00:00
import tvdb_keys , tvdb_api
2018-07-24 03:13:26 +00:00
import os . path
2018-08-19 03:23:04 +00:00
import subprocess
2018-07-24 03:13:26 +00:00
2018-08-03 00:06:48 +00:00
DEBUG = os . path . exists ( os . path . expanduser ( " ~/minerbot2.debug " ) )
2018-07-24 03:13:26 +00:00
def log ( s ) :
with open ( os . path . expanduser ( " ~/minerbot2.log " ) , " a " ) as f :
f . write ( s . rstrip ( ) + " \n " )
2018-06-20 10:51:58 +00:00
2018-08-19 03:23:04 +00:00
def toot ( s ) :
return subprocess . call ( [ " /usr/local/bin/toot " , s ] )
2018-06-20 10:51:58 +00:00
gttapi = gitea . GiteaAPI ( " https://git.tilde.team " )
2018-07-24 03:13:26 +00:00
#ghapi = github.GithubAPI()
2018-06-20 11:20:36 +00:00
tvdb = tvdb_api . Tvdb ( apikey = tvdb_keys . api_key , cache = False )
2018-06-20 10:51:58 +00:00
def pad ( l , n ) :
while len ( l ) < n :
l . append ( " " )
2018-08-19 02:57:14 +00:00
SU_EP_INFO_FORMAT = " {nick} : Season {ep[airedSeason]} , Episode {ep[airedEpisodeNumber]} : {ep[episodeName]} - \" {ep[overview]} \" ; aired {ep[firstAired]} "
2018-06-20 10:51:58 +00:00
class TVBot ( irc . bot . SingleServerIRCBot ) :
def __init__ ( self , channels , nickname , server , port = 6667 , prefix = " ! " , operator = " khuxkm " ) :
irc . bot . SingleServerIRCBot . __init__ ( self , [ ( server , port ) ] , nickname , nickname )
self . chanlist = channels
self . bot_nick = nickname
self . prefix = " ! "
self . botop = operator
self . command_handlers = { }
self . register ( " prefix " , self . setPrefix )
self . register ( " gitea " , self . giteaCommand )
2018-07-24 03:13:26 +00:00
# self.register("github",self.githubCommand)
2018-06-20 10:51:58 +00:00
self . register ( " quit " , self . quitCommand )
self . register ( " reload " , self . reloadCommand )
self . register ( " su " , self . suCommand )
2018-08-19 03:23:04 +00:00
self . register ( " toot " , self . tootCommand )
def tootCommand ( self , c , e , p ) :
p . pop ( 0 )
if not p :
c . privmsg ( e . target , " {} : Usage: {} toot <text> " . format ( e . source . nick , self . prefix ) )
return
if toot ( " " . join ( p ) ) == 0 :
c . privmsg ( e . target , " {} : Tooted! " . format ( e . source . nick ) )
else :
c . privmsg ( e . target , " {} : Toot failed! " . format ( e . source . nick ) )
2018-06-20 10:51:58 +00:00
def suCommand ( self , c , e , p ) :
p . pop ( 0 )
if not p :
p = [ " help " ]
if p [ 0 ] == " fake-leak " :
c . privmsg ( e . target , e . source . nick + " : {} - {} " . format ( * mu . new_episode ( ) ) )
2018-06-20 13:26:20 +00:00
elif p [ 0 ] == " episode " :
if p [ 1 ] == " name " :
name = " " . join ( p [ 2 : ] )
eps = tvdb [ " Steven Universe " ] . search ( name , key = " episodeName " )
if len ( eps ) > 1 :
c . privmsg ( e . target , " {} : can you be a bit more specific, please? " . format ( e . source . nick ) )
elif len ( eps ) == 0 :
c . privmsg ( e . target , " {} : I couldn ' t find the Steven Universe episode \" {} \" . " . format ( e . source . nick , name ) )
else :
ep = eps [ 0 ]
2018-08-19 02:57:14 +00:00
c . privmsg ( e . target , SU_EP_INFO_FORMAT . format ( nick = e . source . nick , ep = ep ) )
2018-06-20 13:26:20 +00:00
elif p [ 1 ] == " number " :
if " x " in p [ 2 ] :
season , number = [ int ( x ) for x in p [ 2 ] . split ( " x " ) ]
else :
season , number = [ int ( x ) for x in [ p [ 2 ] , p [ 3 ] ] ]
ep = tvdb [ " Steven Universe " ] [ season ] [ number ]
2018-08-19 02:57:14 +00:00
c . privmsg ( e . target , SU_EP_INFO_FORMAT . format ( nick = e . source . nick , ep = ep ) )
2018-06-20 13:26:20 +00:00
elif p [ 0 ] == " help " :
c . privmsg ( e . target , " {} : current !su subcommands are: help (shows this message), fake-leak (comes up with a fake leak), episode <number/name> (get an episode by number (i.e; 01x01) or by name (i.e; Gem Glow)) " . format ( e . source . nick ) )
2018-06-20 10:51:58 +00:00
def quitCommand ( self , c , e , p ) :
if e . source . nick == self . botop :
c . quit ( )
raise SystemExit ( 0 )
else :
c . privmsg ( e . target , " You can ' t tell me what to do! " )
def reloadCommand ( self , c , e , p ) :
if e . source . nick == self . botop :
c . quit ( )
raise SystemExit ( 1 )
else :
c . privmsg ( e . target , " You can ' t tell me what to do! " )
def setPrefix ( self , c , e , p ) :
p . pop ( 0 ) # command name
if e . source . nick != self . botop :
return
self . prefix = p [ 0 ]
def gitCommand ( self , api , c , e , p , has_mirrors = True ) :
p . pop ( 0 )
2018-06-20 13:26:20 +00:00
if not p :
return
2018-06-20 10:51:58 +00:00
if p [ 0 ] in ( ' issue ' , ' pull ' ) :
pad ( p , 4 )
global issue_data
if " / " in p [ 1 ] :
owner , repo = p [ 1 ] . split ( " / " )
try :
issue = int ( p [ 2 ] )
except ValueError :
c . privmsg ( e . target , " {} : do you think this is some kind of joke? " . format ( e . source . nick ) )
return
issue_data = api . get_issue_data ( owner , repo , issue )
else :
owner , repo = p [ 1 ] , p [ 2 ]
try :
issue = int ( p [ 3 ] )
except ValueError :
c . privmsg ( e . target , " {} : do you think this is some kind of joke? " . format ( e . source . nick ) )
return
issue_data = api . get_issue_data ( owner , repo , issue )
if issue_data . status_code != 200 :
if has_mirrors :
repo_data = api . get_repo_data ( owner , repo )
if repo_data . json ( ) [ ' mirror ' ] :
c . privmsg ( e . target , " The targeted repo is a mirror. " )
return
c . privmsg ( e . target , " An error occurred. " )
try :
issue_data . raise_for_status ( )
except Exception as e :
2018-07-24 03:13:26 +00:00
log ( e )
2018-06-20 10:51:58 +00:00
else :
issue_data = issue_data . json ( )
descriptor = " Issue "
2018-07-24 05:20:19 +00:00
if ' pull_request ' in issue_data and issue_data [ ' pull_request ' ] is not None :
2018-06-20 10:51:58 +00:00
descriptor = " Pull request "
description = descriptor + " # " + str ( issue_data [ ' number ' ] )
description + = " : \" {} \" " . format ( issue_data [ ' title ' ] )
author = issue_data [ ' user ' ]
description + = " by {} " . format ( author . get ( ' full_name ' ) if author . get ( ' full_name ' ) else author [ ' login ' ] )
if ' html_url ' in issue_data :
description + = " : {} " . format ( issue_data [ " html_url " ] )
else :
description + = " : {} / {} / {} / {} / {} " . format ( api . base_url , owner , repo , descriptor . split ( ) [ 0 ] . lower ( ) + " s " , issue_data [ ' number ' ] )
c . privmsg ( e . target , description )
2018-06-20 13:26:20 +00:00
elif p [ 0 ] == " link " :
pad ( p , 3 )
if " / " in p [ 1 ] :
user , repo = p [ 1 ] . split ( " / " , 1 )
else :
user , repo = p [ 1 ] , p [ 2 ]
repo_data = api . get_repo_data ( user , repo )
if repo_data . status_code != 200 :
c . privmsg ( e . target , " An error occcurred. (Response code = {!s} ) " . format ( repo_data . status_code ) )
return
repo_data = repo_data . json ( )
c . privmsg ( e . target , " {nick} : {r[full_name]} - {r[description]} ; {r[html_url]} " . format ( nick = e . source . nick , r = repo_data ) )
2018-06-20 10:51:58 +00:00
def giteaCommand ( self , c , e , p ) :
self . gitCommand ( gttapi , c , e , p )
2018-07-24 03:13:26 +00:00
# def githubCommand(self,c,e,p):
# self.gitCommand(ghapi,c,e,p,False)
2018-06-20 10:51:58 +00:00
def register ( self , cmd , func ) :
self . command_handlers [ cmd ] = func
def on_welcome ( self , c , e ) :
for channel in self . chanlist :
c . join ( channel )
def on_pubmsg ( self , c , e ) :
self . process_command ( c , e , e . arguments [ 0 ] )
def on_privmsg ( self , c , e ) :
self . process_command ( c , e , e . arguments [ 0 ] )
def process_command ( self , c , e , text ) :
if not text . startswith ( self . prefix ) :
return # only deal with prefixed messages
parts = text [ len ( self . prefix ) : ] . split ( " " )
if not parts [ 0 ] in self . command_handlers :
return # not our command
self . command_handlers [ parts [ 0 ] ] ( c , e , parts )
if __name__ == ' __main__ ' :
channels = [
2018-07-24 03:13:26 +00:00
' #team ' ,
2018-06-20 10:51:58 +00:00
' #meta ' ,
2018-07-24 03:13:26 +00:00
' #quotes ' ,
' #lcpp ' ,
' #journal ' ,
2018-07-24 03:14:57 +00:00
' #sudoers ' ,
2018-08-02 23:52:34 +00:00
' #tildeverse ' ,
' #stevenuniverse ' ,
' #suwp ' ,
' #bots '
2018-06-20 10:51:58 +00:00
]
2018-08-03 00:06:48 +00:00
if DEBUG :
with open ( os . path . expanduser ( " ~/minerbot2.debug " ) ) as f :
channels = [ l . rstrip ( ) for l in f if l . rstrip ( ) ]
2018-06-20 10:51:58 +00:00
bot = TVBot ( channels , ' minerbot2 ' , ' localhost ' )
bot . start ( )
2018-08-02 23:52:34 +00:00