2018-06-15 13:56:35 +00:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
2018-06-17 12:39:22 +00:00
import time , logging , json , requests , datetime , re , gettext , math , random , os . path
2018-06-15 13:56:35 +00:00
from bs4 import BeautifulSoup
2018-06-16 11:16:15 +00:00
from collections import defaultdict
2018-06-17 12:39:22 +00:00
from urllib . parse import quote_plus
2018-06-15 13:56:35 +00:00
logging . basicConfig ( level = logging . DEBUG )
#logging.warning('Watch out!')
#DEBUG, INFO, WARNING, ERROR, CRITICAL
with open ( " settings.json " ) as sfile :
settings = json . load ( sfile )
2018-06-17 12:57:06 +00:00
if settings [ " limitrefetch " ] < settings [ " limit " ] and settings [ " limitrefetch " ] != - 1 :
settings [ " limitrefetch " ] = settings [ " limit " ]
if settings [ " limitrefetch " ] != - 1 and os . path . exists ( " lastchange.txt " ) == False :
2018-06-17 12:39:22 +00:00
with open ( " lastchange.txt " , ' w ' ) as sfile :
sfile . write ( " " )
2018-06-15 13:56:35 +00:00
logging . info ( " Current settings: {settings} " . format ( settings = settings ) )
2018-06-18 09:30:05 +00:00
lang = gettext . translation ( ' rcgcdw ' , localedir = ' locale ' , languages = [ settings [ " lang " ] ] )
lang . install ( )
#_ = lambda s: s
2018-06-15 13:56:35 +00:00
def send ( message , name , avatar ) :
req = requests . post ( settings [ " webhookURL " ] , data = { " content " : message , " avatar_url " : avatar , " username " : name } , timeout = 10 )
2018-06-16 11:16:15 +00:00
def safe_read ( request , * keys ) :
if request is None :
return None
try :
request = request . json ( )
for item in keys :
request = request [ item ]
except KeyError :
logging . warning ( " Failure while extracting data from request on key {key} in {change} " . format ( key = item , change = request ) )
return None
except ValueError :
logging . warning ( " Failure while extracting data from request in {change} " . format ( key = item , change = request ) )
return None
return request
2018-06-15 13:56:35 +00:00
2018-06-16 11:16:15 +00:00
def webhook_formatter ( action , timestamp , * * params ) :
colornumber = None
data = { }
data [ " embeds " ] = [ ]
embed = defaultdict ( dict )
if " title " in params :
article_encoded = params [ " title " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' )
2018-06-16 12:55:51 +00:00
if re . match ( r " \ b \ d { 1,3} \ . \ d { 1,3} \ . \ d { 1,3} \ . \ d { 1,3} \ b " , params [ " user " ] ) is not None :
author_url = " https:// {wiki} .gamepedia.com/Special:Contributions/ {user} " . format ( wiki = settings [ " wiki " ] , user = params [ " user " ] )
if params [ " user " ] not in list ( recent_changes . map_ips . keys ( ) ) :
contibs = safe_read ( recent_changes . safe_request ( " https:// {wiki} .gamepedia.com/api.php?action=query&format=json&list=usercontribs&uclimit=max&ucuser= {user} &ucprop= " . format ( wiki = settings [ " wiki " ] , user = params [ " user " ] ) ) , " query " , " usercontribs " )
2018-06-16 11:16:15 +00:00
if contibs is None :
logging . warning ( " WARNING: Something went wrong when checking amount of contributions for given IP address " )
2018-06-16 12:55:51 +00:00
params [ " user " ] = params [ " user " ] + " (?) "
2018-06-16 11:16:15 +00:00
else :
2018-06-16 12:55:51 +00:00
params [ " user " ] = " {author} ( {contribs} ) " . format ( author = params [ " user " ] , contribs = len ( contibs ) )
recent_changes . map_ips [ params [ " user " ] ] = len ( contibs )
2018-06-16 11:16:15 +00:00
else :
2018-06-16 12:55:51 +00:00
recent_changes . map_ips [ params [ " user " ] ] + = 1
params [ " user " ] = " {author} ( {amount} ) " . format ( author = params [ " user " ] , amount = recent_changes . map_ips [ params [ " user " ] ] )
2018-06-16 11:16:15 +00:00
else :
2018-06-16 12:55:51 +00:00
author_url = " https:// {wiki} .gamepedia.com/User: {user} " . format ( wiki = settings [ " wiki " ] , user = params [ " user " ] . replace ( " " , " _ " ) )
2018-06-16 11:16:15 +00:00
if action in [ 1 , 37 ] : #edit or new page
editsize = params [ " size " ]
2018-06-16 18:27:01 +00:00
print ( editsize )
2018-06-16 11:16:15 +00:00
if editsize > 0 :
if editsize > 6032 :
colornumber = 65280
else :
2018-06-16 18:27:01 +00:00
colornumber = 35840 + ( math . floor ( editsize / ( 52 ) ) ) * 256
2018-06-16 11:16:15 +00:00
elif editsize < 0 :
if editsize < - 6032 :
colornumber = 16711680
else :
2018-06-16 18:27:01 +00:00
colornumber = 9175040 + ( math . floor ( ( editsize * - 1 ) / ( 52 ) ) ) * 65536
2018-06-16 11:16:15 +00:00
elif editsize == 0 :
colornumber = 8750469
link = " https:// {wiki} .gamepedia.com/index.php?title= {article} &curid= {pageid} &diff= {diff} &oldid= {oldrev} " . format ( wiki = settings [ " wiki " ] , pageid = params [ " pageid " ] , diff = params [ " diff " ] , oldrev = params [ " oldrev " ] , article = article_encoded )
2018-06-16 12:55:51 +00:00
if action == 1 :
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " icon_url " ] = " https://d1u5p3l4wpay3k.cloudfront.net/minecraft_pl_gamepedia/d/df/Ksi % C4 %85% C5 % BCka_z_pi % C3 % B3rem.png?version=d2b085f15fb5713091ed06f92f81c360 "
else :
embed [ " author " ] [ " icon_url " ] = " https://framapic.org/VBVcOznftNsV/4a0fbBL7wkUo.png "
2018-06-18 09:30:05 +00:00
embed [ " title " ] = " {article} ( {new} {minor} {editsize} ) " . format ( article = params [ " title " ] , editsize = " + " + str ( editsize ) if editsize > 0 else editsize , new = _ ( " (N!) " ) if action == 37 else " " , minor = _ ( " m " ) if action == 1 and params [ " minor " ] else " " )
2018-06-16 12:55:51 +00:00
elif action == 5 : #sending files
2018-06-16 11:16:15 +00:00
urls = safe_read ( recent_changes . safe_request ( " https:// {wiki} .gamepedia.com/api.php?action=query&format=json&prop=imageinfo&list=&meta=&titles= {filename} &iiprop=timestamp % 7Curl&iilimit=2 " . format ( wiki = settings [ " wiki " ] , filename = params [ " title " ] ) ) , " query " , " pages " )
undolink = " "
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
if urls is not None :
2018-06-16 18:27:01 +00:00
img_info = next ( iter ( urls . values ( ) ) ) [ " imageinfo " ]
2018-06-16 11:16:15 +00:00
embed [ " image " ] [ " url " ] = img_info [ 0 ] [ " url " ]
else :
return
if params [ " overwrite " ] :
colornumber = 12390624
2018-06-16 12:09:28 +00:00
img_timestamp = [ x for x in img_info [ 1 ] [ " timestamp " ] if x . isdigit ( ) ]
2018-06-17 12:39:22 +00:00
undolink = " https:// {wiki} .gamepedia.com/index.php?title= {filename} &action=revert&oldimage= {timestamp} % 21 {filenamewon} " . format ( wiki = settings [ " wiki " ] , filename = article_encoded , timestamp = " " . join ( img_timestamp ) , filenamewon = article_encoded [ 5 : ] )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Uploaded a new version of {name} " ) . format ( name = params [ " title " ] )
2018-06-16 11:16:15 +00:00
embed [ " fields " ] = [ { " name " : _ ( " Options " ) , " value " : _ ( " ([preview]( {link} ) | [undo]( {undolink} )) " ) . format ( link = embed [ " image " ] [ " url " ] , undolink = undolink ) } ]
else :
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Uploaded {name} " ) . format ( name = params [ " title " ] )
2018-06-17 12:39:22 +00:00
article_content = safe_read ( recent_changes . safe_request ( " https:// {wiki} .gamepedia.com/api.php?action=query&format=json&prop=revisions&titles= {article} &rvprop=content " . format ( wiki = settings [ " wiki " ] , article = quote_plus ( params [ " title " ] , safe = ' ' ) ) ) , " query " , " pages " )
2018-06-16 11:16:15 +00:00
if article_content is None :
logging . warning ( " Something went wrong when getting license for the image " )
return 0
2018-06-16 12:09:28 +00:00
content = list ( article_content . values ( ) ) [ 0 ] [ ' revisions ' ] [ 0 ] [ ' * ' ] . lower ( )
2018-06-16 11:16:15 +00:00
if " {{ license " not in content :
2018-06-18 09:30:05 +00:00
license = _ ( " **No license!** " )
2018-06-16 11:16:15 +00:00
else :
matches = re . search ( r " \ { \ { license \ (.*?) \ } \ } " , content )
if matches is not None :
license = matches . group ( 1 )
else :
license = " ? "
2018-06-17 12:39:22 +00:00
embed [ " fields " ] = [ { " name " : _ ( " Options " ) , " value " : _ ( " ([preview]( {link} )) " ) . format ( link = embed [ " image " ] [ " url " ] ) } ]
2018-06-16 11:16:15 +00:00
params [ " desc " ] = _ ( " {desc} \n License: {license} " ) . format ( desc = params [ " desc " ] , license = license )
2018-06-16 12:55:51 +00:00
elif action == 6 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " author " ] [ " icon_url " ] = " https://framapic.org/9Rgw6Vkx1L1b/R9WrMWJ6umeX.png "
colornumber = 1
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Deleted page {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 7 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " author " ] [ " icon_url " ] = " https://framapic.org/9Rgw6Vkx1L1b/R9WrMWJ6umeX.png "
colornumber = 1
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Deleted redirect {article} by overwriting " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 14 :
2018-06-16 11:16:15 +00:00
link = params [ " targetlink " ]
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/ZX02KBf.png "
params [ " desc " ] = " {supress} . {desc} " . format ( desc = params [ " desc " ] , supress = _ ( " No redirect has been made " ) if params [ " supress " ] == True else _ ( " A redirect has been made " ) )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Moved {article} to {target} " ) . format ( article = params [ " title " ] , target = params [ " target " ] )
2018-06-16 12:55:51 +00:00
elif action == 15 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Moved {article} to {title} over redirect " ) . format ( article = params [ " title " ] , title = params [ " target " ] )
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/ZX02KBf.png "
2018-06-16 12:55:51 +00:00
elif action == 16 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Moved protection settings from {article} to {title} " ) . format ( article = params [ " title " ] , title = params [ " target " ] )
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/ZX02KBf.png "
2018-06-16 12:55:51 +00:00
elif action == 17 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {user} " . format ( wiki = settings [ " wiki " ] , user = params [ " blocked_user " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
user = params [ " blocked_user " ] . split ( ' : ' ) [ 1 ]
time = _ ( " infinity and beyond " ) if params [ " duration " ] == " infinite " else params [ " duration " ]
2018-06-16 12:55:51 +00:00
embed [ " title " ] = _ ( " Blocked {blocked_user} for {time} " ) . format ( blocked_user = user , time = time )
2018-06-16 11:16:15 +00:00
colornumber = 1
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/g7KgZHf.png "
2018-06-16 12:55:51 +00:00
elif action == 19 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {user} " . format ( wiki = settings [ " wiki " ] , user = params [ " blocked_user " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
user = params [ " blocked_user " ] . split ( ' : ' ) [ 1 ]
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed block settings for {blocked_user} " ) . format ( blocked_user = user )
2018-06-16 11:16:15 +00:00
colornumber = 1
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/g7KgZHf.png "
2018-06-16 12:55:51 +00:00
elif action == 18 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {user} " . format ( wiki = settings [ " wiki " ] , user = params [ " blocked_user " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
user = params [ " blocked_user " ] . split ( ' : ' ) [ 1 ]
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Unblocked {blocked_user} " ) . format ( blocked_user = user )
2018-06-16 11:16:15 +00:00
colornumber = 1
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/g7KgZHf.png "
2018-06-16 12:55:51 +00:00
elif action == 25 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/UserProfile: {target} " . format ( wiki = settings [ " wiki " ] , target = params [ " target " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
embed [ " title " ] = _ ( " Left a comment on {target} ' s profile " ) . format ( target = params [ " target " ] )
2018-06-16 12:55:51 +00:00
elif action == 29 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/UserProfile: {target} " . format ( wiki = settings [ " wiki " ] , target = params [ " target " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
embed [ " title " ] = _ ( " Replied to a comment on {target} ' s profile " ) . format ( target = params [ " target " ] )
2018-06-16 12:55:51 +00:00
elif action == 26 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/UserProfile: {target} " . format ( wiki = settings [ " wiki " ] , target = params [ " target " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
embed [ " title " ] = _ ( " Edited a comment on {target} ' s profile " ) . format ( target = params [ " target " ] )
2018-06-16 12:55:51 +00:00
elif action == 28 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/UserProfile: {target} " . format ( wiki = settings [ " wiki " ] , target = params [ " target " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
if params [ " field " ] == " profile-location " :
field = _ ( " Location " )
elif params [ " field " ] == " profile-aboutme " :
field = _ ( " About me " )
elif params [ " field " ] == " profile-link-google " :
2018-06-18 09:30:05 +00:00
field = _ ( " Google link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-facebook " :
2018-06-18 09:30:05 +00:00
field = _ ( " Facebook link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-twitter " :
2018-06-18 09:30:05 +00:00
field = _ ( " Twitter link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-reddit " :
2018-06-18 09:30:05 +00:00
field = _ ( " Reddit link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-twitch " :
2018-06-18 09:30:05 +00:00
field = _ ( " Twitch link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-psn " :
2018-06-18 09:30:05 +00:00
field = _ ( " PSN link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-vk " :
2018-06-18 09:30:05 +00:00
field = _ ( " VK link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-xbl " :
2018-06-18 09:30:05 +00:00
field = _ ( " XVL link " )
2018-06-16 11:16:15 +00:00
elif params [ " field " ] == " profile-link-steam " :
2018-06-18 09:30:05 +00:00
field = _ ( " Steam link " )
2018-06-16 11:16:15 +00:00
else :
field = _ ( " Unknown " )
embed [ " title " ] = _ ( " Edited {target} ' s profile " ) . format ( target = params [ " target " ] )
params [ " desc " ] = _ ( " {field} field changed to: {desc} " ) . format ( field = field , desc = params [ " desc " ] )
2018-06-16 12:55:51 +00:00
elif action == 27 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/UserProfile: {target} " . format ( wiki = settings [ " wiki " ] , target = params [ " target " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' ) )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Deleted a comment on {target} ' s profile " ) . format ( target = params [ " target " ] )
2018-06-16 12:55:51 +00:00
elif action == 20 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ " + params [ " user " ] . replace ( " " , " _ " ) . replace ( ' ) ' , ' \ ) ' )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed group membership for {target} " ) . format ( target = params [ " user " ] )
2018-06-16 11:16:15 +00:00
if params [ " old_groups " ] . count ( ' ' ) < params [ " new_groups " ] . count ( ' ' ) :
embed [ " thumbnail " ] [ " url " ] = " https://i.imgur.com/WnGhF5g.gif "
if len ( params [ " old_groups " ] ) < 4 :
params [ " old_groups " ] = _ ( " none " )
if len ( params [ " new_groups " ] ) < 4 :
params [ " new_groups " ] = _ ( " none " )
2018-06-18 09:30:05 +00:00
reason = " | {desc} " . format ( desc = params [ " desc " ] ) if params [ " desc " ] != _ ( " No description provided " ) else " "
params [ " desc " ] = _ ( " Groups changed from {old_groups} to {new_groups} {reason} " ) . format ( old_groups = params [ " old_groups " ] , new_groups = params [ " new_groups " ] , reason = reason )
2018-06-16 12:55:51 +00:00
elif action == 2 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Protected {target} " ) . format ( target = params [ " title " ] )
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/Lfk0wuw.png "
params [ " desc " ] = params [ " settings " ] + " | " + params [ " desc " ]
2018-06-16 12:55:51 +00:00
elif action == 3 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed protection level for {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
params [ " desc " ] = params [ " settings " ] + " | " + params [ " desc " ]
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/Lfk0wuw.png "
2018-06-16 12:55:51 +00:00
elif action == 4 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Removed protection from {article} " ) . format ( article = params [ " title " ] )
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " icon_url " ] = " https://i.imgur.com/Lfk0wuw.png "
2018-06-16 12:55:51 +00:00
elif action == 9 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed visibility of revision(s) on page {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 11 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Imported {article} with {count} revision(s) " ) . format ( article = params [ " title " ] , count = params [ " amount " ] )
2018-06-16 12:55:51 +00:00
elif action == 8 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Restored {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 10 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:RecentChanges " . format ( wiki = settings [ " wiki " ] )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed visibility of log events " )
2018-06-16 12:55:51 +00:00
elif action == 12 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:RecentChanges " . format ( wiki = settings [ " wiki " ] )
embed [ " title " ] = _ ( " Imported interwiki " )
2018-06-16 12:55:51 +00:00
elif action == 21 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:RecentChanges " . format ( wiki = settings [ " wiki " ] )
embed [ " title " ] = _ ( " Edited abuse filter number {number} " ) . format ( number = params [ " filternr " ] )
2018-06-18 09:30:05 +00:00
elif action == 13 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Merged revision histories of {article} into {dest} " ) . format ( article = params [ " title " ] , dest = params [ " destination " ] )
2018-06-16 12:55:51 +00:00
elif action == 22 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:Interwiki " . format ( wiki = settings [ " wiki " ] )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Added an entry to the interwiki table " )
2018-06-16 11:16:15 +00:00
params [ " desc " ] = _ ( " Prefix: {prefix} , website: {website} | {desc} " ) . format ( desc = params [ " desc " ] , prefix = params [ " prefix " ] , website = params [ " website " ] )
2018-06-16 12:55:51 +00:00
elif action == 23 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:Interwiki " . format ( wiki = settings [ " wiki " ] )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Edited an entry in interwiki table " )
2018-06-16 11:16:15 +00:00
params [ " desc " ] = _ ( " Prefix: {prefix} , website: {website} | {desc} " ) . format ( desc = params [ " desc " ] , prefix = params [ " prefix " ] , website = params [ " website " ] )
2018-06-16 12:55:51 +00:00
elif action == 24 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/Special:Interwiki " . format ( wiki = settings [ " wiki " ] )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Deleted an entry in interwiki table " )
2018-06-16 11:16:15 +00:00
params [ " desc " ] = _ ( " Prefix: {prefix} | {desc} " ) . format ( desc = params [ " desc " ] , prefix = params [ " prefix " ] )
2018-06-16 12:55:51 +00:00
elif action == 30 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
2018-06-18 09:30:05 +00:00
embed [ " title " ] = _ ( " Changed the content model of the page {article} " ) . format ( article = params [ " title " ] )
2018-06-16 11:16:15 +00:00
params [ " desc " ] = _ ( " Model changed from {old} to {new} : {reason} " ) . format ( old = params [ " oldmodel " ] , new = params [ " newmodel " ] , reason = params [ " desc " ] )
2018-06-16 12:55:51 +00:00
elif action == 31 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Edited the sprite for {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 32 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Created the sprite sheet for {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 33 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Edited the slice for {article} " ) . format ( article = params [ " title " ] )
2018-06-16 12:55:51 +00:00
elif action == 34 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Created a tag \" {tag} \" " ) . format ( article = params [ " additional " ] [ " tag " ] )
2018-06-16 12:55:51 +00:00
elif action == 35 :
2018-06-16 11:16:15 +00:00
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Deleted a tag \" {tag} \" " ) . format ( article = params [ " additional " ] [ " tag " ] )
2018-06-18 09:30:05 +00:00
elif action == 36 :
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Activated a tag \" {tag} \" " ) . format ( article = params [ " additional " ] [ " tag " ] )
elif action == 38 :
link = " https:// {wiki} .gamepedia.com/ {article} " . format ( wiki = settings [ " wiki " ] , article = article_encoded )
embed [ " title " ] = _ ( " Deactivated a tag \" {tag} \" " ) . format ( article = params [ " additional " ] [ " tag " ] )
2018-06-16 11:16:15 +00:00
else :
2018-06-16 12:55:51 +00:00
logging . warning ( " No entry for {event} with params: {params} " . format ( event = action , params = params ) )
embed [ " author " ] [ " name " ] = params [ " user " ]
2018-06-16 11:16:15 +00:00
embed [ " author " ] [ " url " ] = author_url
embed [ " url " ] = link
if " desc " not in params :
params [ " desc " ] = " "
embed [ " description " ] = params [ " desc " ]
embed [ " color " ] = random . randrange ( 1 , 16777215 ) if colornumber is None else math . floor ( colornumber )
embed [ " timestamp " ] = timestamp
data [ " embeds " ] . append ( dict ( embed ) )
2018-06-18 09:30:05 +00:00
data [ ' avatar_url ' ] = settings [ " avatars " ] [ " embed " ]
2018-06-16 11:16:15 +00:00
formatted_embed = json . dumps ( data , indent = 4 )
headers = { ' Content-Type ' : ' application/json ' }
2018-06-16 18:27:01 +00:00
#logging.debug(data)
2018-06-16 11:16:15 +00:00
result = requests . post ( settings [ " webhookURL " ] , data = formatted_embed , headers = headers )
2018-06-15 13:56:35 +00:00
def first_pass ( change ) :
parsedcomment = ( BeautifulSoup ( change [ " parsedcomment " ] , " lxml " ) ) . get_text ( )
if not parsedcomment :
2018-06-16 11:16:15 +00:00
parsedcomment = _ ( " No description provided " )
2018-06-15 13:56:35 +00:00
if change [ " type " ] == " edit " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 1 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , oldrev = change [ " old_revid " ] , pageid = change [ " pageid " ] , diff = change [ " revid " ] , size = change [ " newlen " ] - change [ " oldlen " ] , minor = True if " minor " in change else False )
2018-06-15 17:49:31 +00:00
elif change [ " type " ] == " log " :
logtype = change [ " logtype " ]
logaction = change [ " logaction " ]
if logtype == " protect " and logaction == " protect " :
webhook_formatter ( 2 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , settings = change [ " logparams " ] [ " description " ] )
elif logtype == " protect " and logaction == " modify " :
webhook_formatter ( 3 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , settings = change [ " logparams " ] [ " description " ] )
elif logtype == " protect " and logaction == " unprotect " :
webhook_formatter ( 4 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " upload " and logaction == " overwrite " :
webhook_formatter ( 5 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , overwrite = True )
elif logtype == " upload " :
webhook_formatter ( 5 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , overwrite = False )
elif logtype == " delete " and logaction == " delete " :
webhook_formatter ( 6 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " delete " and logaction == " delete_redir " :
webhook_formatter ( 7 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " delete " and logaction == " restore " :
webhook_formatter ( 8 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " delete " and logaction == " revision " :
webhook_formatter ( 9 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " delete " and logaction == " event " :
webhook_formatter ( 10 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment )
elif logtype == " import " and logaction == " upload " :
webhook_formatter ( 11 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , amount = change [ " logparams " ] [ " count " ] )
elif logtype == " import " and logaction == " interwiki " :
webhook_formatter ( 12 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment )
elif logtype == " merge " :
2018-06-18 09:30:05 +00:00
webhook_formatter ( 13 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , destination = change [ " logparams " ] [ " dest_title " ] )
2018-06-15 17:49:31 +00:00
elif logtype == " move " and logaction == " move " :
2018-06-16 12:55:51 +00:00
webhook_formatter ( 14 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , supress = True if " suppressredirect " in change [ " logparams " ] else False , target = change [ " logparams " ] [ ' target_title ' ] , targetlink = " https:// {wiki} .gamepedia.com/ " . format ( wiki = settings [ " wiki " ] ) + change [ " logparams " ] [ ' target_title ' ] . replace ( " " , " _ " ) ) #TODO Remove the link making in here
2018-06-15 17:49:31 +00:00
elif logtype == " move " and logaction == " move_redir " :
webhook_formatter ( 15 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , target = change [ " logparams " ] [ " target_title " ] )
elif logtype == " protect " and logaction == " move_prot " :
webhook_formatter ( 16 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , target = change [ " logparams " ] [ " oldtitle_title " ] )
elif logtype == " block " and logaction == " block " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 17 , change [ " timestamp " ] , user = change [ " user " ] , blocked_user = change [ " title " ] , desc = parsedcomment , duration = change [ " logparams " ] [ " duration " ] )
2018-06-15 17:49:31 +00:00
elif logtype == " block " and logaction == " unblock " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 18 , change [ " timestamp " ] , user = change [ " user " ] , blocked_user = change [ " title " ] , desc = parsedcomment )
2018-06-15 17:49:31 +00:00
elif logtype == " block " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 19 , change [ " timestamp " ] , user = change [ " user " ] , blocked_user = change [ " title " ] , desc = parsedcomment )
2018-06-15 17:49:31 +00:00
elif logtype == " rights " :
webhook_formatter ( 20 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , old_groups = ' ' . join ( change [ " logparams " ] [ " oldgroups " ] ) , new_groups = ' ' . join ( change [ " logparams " ] [ " newgroups " ] ) )
elif logtype == " abusefilter " :
webhook_formatter ( 21 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment , filternr = change [ " logparams " ] [ ' 1 ' ] )
elif logtype == " interwiki " and logaction == " iw_add " :
webhook_formatter ( 22 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment , prefix = change [ " logparams " ] [ ' 0 ' ] , website = change [ " logparams " ] [ ' 1 ' ] )
elif logtype == " interwiki " and logaction == " iw_edit " :
webhook_formatter ( 23 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment , prefix = change [ " logparams " ] [ ' 0 ' ] , website = change [ " logparams " ] [ ' 1 ' ] )
elif logtype == " interwiki " and logaction == " iw_delete " :
webhook_formatter ( 24 , change [ " timestamp " ] , user = change [ " user " ] , desc = parsedcomment , prefix = change [ " logparams " ] [ ' 0 ' ] )
elif logtype == " curseprofile " and logaction == " comment-created " :
webhook_formatter ( 25 , change [ " timestamp " ] , user = change [ " user " ] , target = change [ " title " ] . split ( ' : ' ) [ 1 ] )
elif logtype == " curseprofile " and logaction == " comment-edited " :
webhook_formatter ( 26 , change [ " timestamp " ] , user = change [ " user " ] , target = change [ " title " ] . split ( ' : ' ) [ 1 ] )
elif logtype == " curseprofile " and logaction == " comment-deleted " :
webhook_formatter ( 27 , change [ " timestamp " ] , user = change [ " user " ] , target = change [ " title " ] . split ( ' : ' ) [ 1 ] )
elif logtype == " curseprofile " and logaction == " profile-edited " :
webhook_formatter ( 28 , change [ " timestamp " ] , user = change [ " user " ] , target = change [ " title " ] . split ( ' : ' ) [ 1 ] , field = change [ " logparams " ] [ ' 0 ' ] , desc = change [ " parsedcomment " ] )
elif logtype == " curseprofile " and logaction == " comment-replied " :
webhook_formatter ( 29 , change [ " timestamp " ] , user = change [ " user " ] , target = change [ " title " ] . split ( ' : ' ) [ 1 ] )
elif logtype == " contentmodel " and logaction == " change " :
webhook_formatter ( 30 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , oldmodel = change [ " logparams " ] [ " oldmodel " ] , newmodel = change [ " logparams " ] [ " newmodel " ] )
elif logtype == " sprite " and logaction == " sprite " :
webhook_formatter ( 31 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " sprite " and logaction == " sheet " :
webhook_formatter ( 32 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " sprite " and logaction == " slice " :
webhook_formatter ( 33 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
elif logtype == " managetags " and logaction == " create " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 34 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , additional = change [ " params " ] )
2018-06-15 17:49:31 +00:00
elif logtype == " managetags " and logaction == " delete " :
2018-06-16 11:16:15 +00:00
webhook_formatter ( 35 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , additional = change [ " params " ] )
2018-06-18 09:30:05 +00:00
elif logtype == " managetags " and logaction == " activate " :
webhook_formatter ( 36 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , additional = change [ " params " ] )
elif logtype == " managetags " and logaction == " deactivate " :
webhook_formatter ( 38 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , additional = change [ " params " ] )
2018-06-15 17:49:31 +00:00
elif logtype == " tag " and logaction == " update " :
2018-06-18 09:30:05 +00:00
webhook_formatter ( 39 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment )
2018-06-15 17:49:31 +00:00
else :
logging . warning ( " No entry matches given change! " )
print ( change )
2018-06-18 09:30:05 +00:00
send ( _ ( " Unable to process the event " ) , _ ( " error " ) , settings [ " avatars " ] [ " no_event " ] )
2018-06-15 17:49:31 +00:00
return
2018-06-17 12:39:22 +00:00
if change [ " type " ] == " external " : #not sure what happens then, but it's listed as possible type
logging . warning ( " External event happened, ignoring. " )
print ( change )
return
elif change [ " type " ] == " new " : #new page
webhook_formatter ( 37 , change [ " timestamp " ] , user = change [ " user " ] , title = change [ " title " ] , desc = parsedcomment , oldrev = change [ " old_revid " ] , pageid = change [ " pageid " ] , diff = change [ " revid " ] , size = change [ " newlen " ] )
2018-06-15 13:56:35 +00:00
class recent_changes ( object ) :
starttime = time . time ( )
day = datetime . date . fromtimestamp ( time . time ( ) ) . day
cache = [ ]
ids = [ ]
2018-06-16 11:16:15 +00:00
map_ips = { }
2018-06-15 13:56:35 +00:00
recent_id = 0
downtimecredibility = 0
2018-06-16 11:16:15 +00:00
last_downtime = 0
2018-06-17 12:57:06 +00:00
if settings [ " limitrefetch " ] != - 1 :
with open ( " lastchange.txt " , " r " ) as record :
file_id = int ( record . read ( ) . strip ( ) )
logging . debug ( " File_id is {val} " . format ( val = file_id ) )
else :
2018-06-18 09:30:05 +00:00
file_id = 999999999
2018-06-15 13:56:35 +00:00
def add_cache ( self , change ) :
self . cache . append ( change )
self . ids . append ( change [ " rcid " ] )
2018-06-17 12:39:22 +00:00
#self.recent_id = change["rcid"]
2018-06-15 13:56:35 +00:00
if len ( self . ids ) > settings [ " limit " ] + 5 :
self . ids . pop ( 0 )
2018-06-17 12:39:22 +00:00
def fetch ( self , amount = settings [ " limit " ] ) :
self . recent_id = self . fetch_changes ( amount = amount )
2018-06-17 12:57:06 +00:00
if settings [ " limitrefetch " ] != - 1 and self . recent_id != self . file_id :
2018-06-17 12:39:22 +00:00
self . file_id = self . recent_id
with open ( " lastchange.txt " , " w " ) as record :
record . write ( str ( self . file_id ) )
logging . debug ( " Most recent rcid is: {} " . format ( self . recent_id ) )
def fetch_changes ( self , amount , clean = False ) :
2018-06-15 13:56:35 +00:00
if len ( self . cache ) == 0 :
logging . debug ( " cache is empty, triggering clean fetch " )
clean = True
2018-06-17 12:39:22 +00:00
changes = self . safe_request ( " https:// {wiki} .gamepedia.com/api.php?action=query&format=json&list=recentchanges&rcshow=!bot&rcprop=title % 7Ctimestamp % 7Cids % 7Cloginfo % 7Cparsedcomment % 7Csizes % 7Cflags % 7Ctags % 7Cuser&rclimit= {amount} &rctype=edit % 7Cnew % 7Clog % 7Cexternal " . format ( wiki = settings [ " wiki " ] , amount = amount ) )
2018-06-15 13:56:35 +00:00
if changes :
try :
changes = changes . json ( ) [ ' query ' ] [ ' recentchanges ' ]
changes . reverse ( )
except ValueError :
logging . warning ( " ValueError in fetching changes " )
self . downtime_controller ( )
return None
except KeyError :
logging . warning ( " Wiki returned %s " % ( request . json ( ) ) )
return None
else :
2018-06-18 09:30:05 +00:00
if self . downtimecredibility > 0 :
self . downtimecredibility - = 1
2018-06-16 11:26:21 +00:00
for change in changes :
2018-06-15 13:56:35 +00:00
if change [ " rcid " ] in self . ids :
continue
self . add_cache ( change )
2018-06-17 12:39:22 +00:00
if clean and not ( self . recent_id == 0 and change [ " rcid " ] > self . file_id ) :
logging . debug ( " Rejected {val} " . format ( val = change [ " rcid " ] ) )
2018-06-15 13:56:35 +00:00
continue
2018-06-16 12:55:51 +00:00
first_pass ( change )
2018-06-17 12:39:22 +00:00
time . sleep ( 1.0 )
return change [ " rcid " ]
2018-06-15 13:56:35 +00:00
def safe_request ( self , url ) :
try :
request = requests . get ( url , timeout = 10 , headers = settings [ " header " ] )
except requests . exceptions . Timeout :
logging . warning ( " Reached timeout error for request on link {url} " )
self . downtime_controller ( )
return None
except requests . exceptions . ConnectionError :
logging . warning ( " Reached connection error for request on link {url} " )
self . downtime_controller ( )
return None
else :
return request
def check_connection ( self ) :
online = 0
for website in [ " https://google.com " , " https://instagram.com " , " https://steamcommunity.com " ] :
try :
requests . get ( website , timeout = 10 )
online + = 1
except requests . exceptions . ConnectionError :
pass
except requests . exceptions . Timeout :
pass
if online < 1 :
logging . error ( " Failure when checking Internet connection at {time} " . format ( time = time . strftime ( " %a , %d % b % Y % H: % M: % S " , time . localtime ( ) ) ) )
return False
return True
def downtime_controller ( self ) :
if self . downtimecredibility < 60 :
self . downtimecredibility + = 15
else :
2018-06-16 11:16:15 +00:00
if ( time . time ( ) - self . last_downtime ) > 1800 and self . check_connection ( ) : #check if last downtime happened within 30 minutes, if yes, don't send a message
2018-06-18 09:30:05 +00:00
send ( _ ( " {wiki} seems to be down or unreachable. " ) . format ( wiki = settings [ " wiki " ] ) , _ ( " Connection status " ) , settings [ " avatars " ] [ " connection_failed " ] )
2018-06-16 11:16:15 +00:00
self . last_downtime = time . time ( )
2018-06-15 13:56:35 +00:00
recent_changes = recent_changes ( )
2018-06-17 12:57:06 +00:00
recent_changes . fetch ( amount = settings [ " limitrefetch " ] if settings [ " limitrefetch " ] != - 1 else settings [ " limit " ] )
2018-06-15 13:56:35 +00:00
while 1 :
2018-06-16 11:16:15 +00:00
time . sleep ( float ( settings [ " cooldown " ] ) )
recent_changes . fetch ( )
2018-06-15 13:56:35 +00:00
if ( recent_changes . day != datetime . date . fromtimestamp ( time . time ( ) ) . day ) :
logging . info ( " A brand new day! Printing the summary and clearing the cache " )
2018-06-16 11:16:15 +00:00
#recent_changes.summary()
#recent_changes.clear_cache()
2018-06-17 12:39:22 +00:00
recent_changes . day = datetime . date . fromtimestamp ( time . time ( ) ) . day