Guest User

Untitled

a guest
Sep 6th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.23 KB | None | 0 0
  1. import requests
  2. import requests.auth
  3. import sys
  4. import time
  5. import os
  6. import random
  7. from pprint import pprint
  8. from firebase import firebase
  9. import datetime
  10.  
  11. # variables #
  12. print('setting variables')
  13. id = id code
  14. secret = secret code
  15. userAgent = user agent
  16. user = user account name
  17. password = password
  18. waiting = 60
  19. url = subreddit url
  20.  
  21. fb = firebase.FirebaseApplication('https://dbid.firebaseio.com/', None)
  22.  
  23. headers = {'User-agent': userAgent}
  24. print('variables set')
  25.  
  26.  
  27. # functions #
  28.  
  29. class Token:
  30.     def __init__(self):
  31.         self.files = []
  32.  
  33.     def __enter__(self):
  34.         print('getting token')
  35.         client_auth = requests.auth.HTTPBasicAuth(id, secret)  # id and secret
  36.         post_data = {'grant_type': 'password', 'username': user, 'password': password, 'scope': 'submit identity'}  # post data to request access token
  37.         headers = {'User-agent': userAgent}  # user agent header
  38.         r = requests.post('https://www.reddit.com/api/v1/access_token', auth=client_auth, data=post_data, headers=headers)
  39.         msg = r.json()
  40.         print('token received')
  41.         self.accessToken = msg['access_token']
  42.  
  43.         return self
  44.  
  45.     def __exit__(self, exc_type, exc_value, traceback):
  46.         print('revoking token')
  47.         headers = {'User-agent': userAgent}
  48.         post_data = {'token': self.accessToken, 'token_type_hint': 'access_token'}
  49.         client_auth = requests.auth.HTTPBasicAuth(id, secret)
  50.         r = requests.post('https://www.reddit.com/api/v1/revoke_token', auth=client_auth, data=post_data, headers=headers)
  51.         print('token revoked')
  52.        
  53.  
  54. def reply(commentId, text):
  55.     with Token() as token:
  56.         headers = {'Authorization': 'bearer ' + token.accessToken, 'User-Agent': user}
  57.         post_data = {'thing_id': 't1_' + commentId, 'api_type': 'json', 'text': text}
  58.         r = requests.post('https://oauth.reddit.com/api/comment', headers=headers, data=post_data)
  59.  
  60. class Events:
  61.     def __init__(self, firebase):
  62.         self.fb = firebase
  63.    
  64.     def getEvents(self):
  65.         events = self.fb.get('/events', None)
  66.         text = 'event|date\n:--|:--'
  67.         for key in events:
  68.             eventD, eventM, eventY = map(int, events[key]['date'].split('/'))
  69.             eventDate = datetime.datetime(eventY, eventM, eventD)
  70.             if eventDate < datetime.datetime.now():
  71.                 text += '\n~~' + key + '~~|~~' + events[key]['date']+'~~'
  72.             else:
  73.                 text += '\n'+key+'|'+events[key]['date']
  74.         return text
  75.  
  76.     def save(self, eventName, date):
  77.         self.fb.put('/events', eventName, {'date': date})
  78.  
  79. class Comment:
  80.     def __init__(self, url):
  81.         self.url = url + '?limit=1'
  82.    
  83.     def getNextComment(self):
  84.         print('getting latest comment')
  85.         headers = {'User-agent': userAgent}
  86.         r = requests.get(self.url, headers=headers)
  87.         rJson = r.json()
  88.         data = rJson['data']['children']
  89.    
  90.         msg = data[0]
  91.         comment = msg['data']['body']
  92.         commentId = msg['data']['id']
  93.         linkUrl = msg['data']['link_url']
  94.  
  95.         self.parseComment(comment)
  96.         self.commentId = commentId
  97.         self.linkUrl = linkUrl
  98.  
  99.     def parseComment(self, command):
  100.         self.command = command
  101.         if len(command) > 0:
  102.             self.commandSplit = comment.split(' ')
  103.             if len(commandSplit) >= 1:
  104.                 self.botCommand = commandSplit[0]
  105.             if len(commandSplit) >= 2:
  106.                 self.botAction = commandSplit[1]
  107.  
  108.     def hasCommand():
  109.  
  110.  
  111. class Bot:
  112.     def __init__(self, url, firebase):
  113.         self.url = url
  114.         self.events = Events(firebase)
  115.  
  116.     def loop():
  117.         comment = Comment(self.url)
  118.         # main loop #
  119.         while 1:
  120.             # main loop code #
  121.             comment.getNextComment()
  122.        
  123.             if comment.botCommand == '!bot':
  124.                 print(comment)
  125.        
  126.                 if comment.botAction == 'roll20':
  127.                     rng = random.randint(1,20)
  128.                     reply(comment.commentId, 'Rolling d20, the result is: ' +str(rng))
  129.                     print('commented to ' +comment.commentId)
  130.        
  131.                 elif comment.botAction == 'create':
  132.                     if len(comment.commentSplit) == 4 and '/' in comment.commentSplit[3]  :
  133.        
  134.                         dateD, dateM, dateY = map(int, comment.commentSplit[3].split('/'))
  135.                         date = datetime.date(dateY, dateM, dateD)
  136.                         date = date.strftime('%d/%m/%Y')
  137.                         print(date)
  138.        
  139.                         event.save(comment.commentSplit[2], comment.commentSplit[3])
  140.                        
  141.                         print('created new event: ' + comment.commentSplit[2])
  142.                     else:
  143.                         print('wrong comment format')
  144.        
  145.                 elif comment.botAction == 'list':
  146.                     text = getEvents()
  147.                     reply(comment.commentId, text)
  148.        
  149.             else:
  150.                 print('no comment the bot can use.')
  151.        
  152.             print('trying again in ' + str(waiting) + 'seconds')
  153.             sys.stdout.flush()
  154.             time.sleep(waiting)
  155.  
  156. Bot(url, fb).loop()
Add Comment
Please, Sign In to add comment