Advertisement
Guest User

Untitled

a guest
Apr 14th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.84 KB | None | 0 0
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. import time
  4. import json
  5. from datetime import datetime
  6. import random
  7. import os.path
  8.  
  9. if not os.path.isfile("data.json"):
  10. with open("data.json", "w") as f:
  11. f.write("{}")
  12.  
  13. leaderboard = []
  14. with open('data.json') as f:
  15. leaderboard = json.load(f)
  16.  
  17. if not os.path.isfile("steam.json"):
  18. with open("steam.json", "w") as f:
  19. f.write("{}")
  20.  
  21. steamIDs = []
  22. with open('steam.json') as f:
  23. steamIDs = json.load(f)
  24.  
  25. messageIDs = []
  26. permWaitTime = 5
  27. sleepTime = 5
  28. timeToServe = 60
  29. debug = False
  30. debugMessage = False
  31. semprexity = False
  32. lastSeenTime = time.time()
  33. first = True
  34.  
  35. restrictTime = 6
  36. lastMessage = 0
  37.  
  38. username = ""
  39. password = ""
  40.  
  41. profile = webdriver.FirefoxProfile("C:\\firefoxSelenium")
  42. driver = webdriver.Firefox(profile)
  43.  
  44. driver.implicitly_wait(10)
  45.  
  46. servingTrivia = False
  47. triviaStarted = 0
  48. currentQuestion = ""
  49. currentDifficulty = 0
  50. currentAnswer = []
  51.  
  52. SUFFIXES = {1: 'st', 2: 'nd', 3: 'rd'}
  53. def ordinal(num):
  54. if 10 <= num % 100 <= 20:
  55. suffix = 'th'
  56. else:
  57. suffix = SUFFIXES.get(num % 10, 'th')
  58. return str(num) + suffix
  59.  
  60. def login():
  61. driver.get("https://clwo.eu/index.php")
  62.  
  63. if "Log out" in driver.find_element_by_class_name("dropdown").get_attribute('innerHTML'):
  64. return "Remembered"
  65.  
  66. driver.find_element_by_class_name("Login").click()
  67.  
  68. ufield = driver.find_element_by_id("quick_login_username")
  69. pfield = driver.find_element_by_id("quick_login_password")
  70.  
  71. ufield.send_keys(username)
  72. pfield.send_keys(password)
  73. pfield.send_keys(Keys.ENTER)
  74.  
  75. return "New Login"
  76.  
  77. def scrapeShoutbox():
  78. global first
  79. if first:
  80. first = False
  81.  
  82. entries = driver.find_element_by_class_name("data")
  83.  
  84. allEntries = entries.get_attribute('innerHTML')
  85. individualEntries = allEntries.split('<div style="display: block;" class="entry" data-id="')
  86. individualEntries.pop(0)
  87. if semprexity:
  88. listOfEntries = [{'text': '!trivia', 'date': 14603112000, 'name': 'Semprexity'}]
  89. else:
  90. listOfEntries = []
  91. for entry in individualEntries:
  92. details = {}
  93. # print(entry)
  94. details["id"] = entry[:4]
  95. # print(details["id"])
  96. entry = entry[21:]
  97. entry = entry.split('" data-own="">\n')
  98. try:
  99. blarg = entry[1]
  100. except:
  101. entry = entry[0].split('">\n')
  102. details["name"] = entry[0]
  103. # print("Name: " + name)
  104. # print(details["name"])
  105. # print(entry)
  106. entry = entry[1].split('<div class="text">')
  107. entry = entry[1].split('</div>\n <div class="info"><span class="date">')
  108. details["text"] = entry[0]
  109. # print("Text: " + text)
  110. entry = entry[1].split('</span><a href="" class="mo')
  111. # 10 Apr 17:04
  112. tempDate = datetime.strptime(entry[0] + " 2016", "%d %b %H:%M %Y")
  113. details["date"] = int(time.mktime(time.strptime(str(tempDate), '%Y-%m-%d %H:%M:%S'))) - time.timezone
  114. # print("Date: " + date)
  115. # print(details)
  116. listOfEntries.append(details)
  117.  
  118. # print("We scraped " + str(len(listOfEntries)) + " entries")
  119. return listOfEntries
  120.  
  121. def sendMessage(message, test=False, bot="(TriviaBot) "):
  122. time.sleep(permWaitTime)
  123. global lastMessage, restrictTime
  124. # print(time.time() - lastMessage)
  125. if time.time() - lastMessage > restrictTime:
  126. lastMessage = time.time()
  127. if debugMessage or test:
  128. message = "/pvt 897 " + bot + message
  129. else:
  130. message = bot + message
  131. if not debug:
  132. print(message)
  133. messageField = driver.find_element_by_xpath("//input[@placeholder='ENTER your message...']")
  134. messageField.send_keys(message)
  135. messageField.send_keys(Keys.ENTER)
  136. else:
  137. print(message)
  138. else:
  139. waitTime = restrictTime - (time.time() - lastMessage)
  140. print("Messaging Too Quickly, Holding " + str(int(waitTime)) + " Seconds")
  141. time.sleep(waitTime)
  142. sendMessage(message)
  143.  
  144.  
  145. def handleMessages(messages):
  146. global timeToServe, lastSeenTime
  147. for message in reversed(messages):
  148. # print(message)
  149. # print("LastSeen: " + str(lastSeenTime) + " MessageDate: " + str(message['date']))
  150. if lastSeenTime > message['date']:
  151. pass
  152. else:
  153. if message['id'] not in messageIDs:
  154. messageIDs.append(message['id'])
  155. print("Tested " + message['text'])
  156. if "(TriviaBot)" not in message['text']:
  157. if "!trivia" in message['text']:
  158. # Someone asked for a trivia question
  159. print("Serving Trivia: " + str(servingTrivia))
  160. if not servingTrivia:
  161. print(message['name'] + " wanted a trivia question")
  162. startTrivia()
  163. else:
  164. timeLeft = int(timeToServe - (time.time() - triviaStarted))
  165. sendMessage(message['name'] + ", you asked for a trivia but there is already one up! Please wait " + str(timeLeft) + " seconds until that trivia ends.")
  166. if "!answer" in message['text']:
  167. if servingTrivia:
  168. checkAnswer(message['text'], message['name'])
  169. else:
  170. sendMessage(message['name'] + ", there isn't a trivia up at the moment to answer!")
  171. if "!position" in message['text']:
  172. sendMessage(message['name'] + ", you are currently " + ordinal(checkPosition(message['name'])) + " in the leaderboard of " + str(len(leaderboard)) + " people!")
  173. if "!help" in message['text']:
  174. sendMessage("Currently supported commands: !trivia, !answer <answer>, !position, !help")
  175. lastSeenTime = messages[0]['date'] - 5
  176.  
  177. def startTrivia(difficulty=-1):
  178. global servingTrivia, triviaStarted, currentDifficulty, currentQuestion, currentAnswer
  179. servingTrivia = True
  180. triviaStarted = time.time()
  181. while 1:
  182. data = random.choice(open("questions.psv").readlines()).split("|")
  183. if int(data[0]) == difficulty or difficulty == -1:
  184. break
  185. currentDifficulty = int(data[0])
  186. currentQuestion = data[1]
  187. data.pop(0)
  188. data.pop(0)
  189. currentAnswer = data
  190. currentAnswer[-1] = currentAnswer[-1].strip()
  191. sendMessage(currentQuestion)
  192. print(currentDifficulty)
  193. print(currentAnswer)
  194.  
  195. def checkAnswer(answer, player):
  196. global currentAnswer, servingTrivia, triviaStarted, currentQuestion, currentDifficulty
  197. answer = answer.replace("!answer ", "")
  198. answer = answer.replace('<span class="private-message"><b>Private shout from <span class="private-username">Popey456963</span></b>: </span> ', "")
  199. print(player + " submitted the answer: " + answer)
  200. if answer.lower in currentAnswer:
  201. if player in leaderboard:
  202. leaderboard[player] += 1
  203. else:
  204. leaderboard[player] = 1
  205. storeLeaderboard()
  206. sendMessage("Congratulations " + player + " on getting the answer right! That is the " + ordinal(leaderboard[player]) + " question you've got right!")
  207. servingTrivia = False
  208. triviaStarted = 0
  209. currentQuestion = ""
  210. currentDifficulty = 0
  211. currentAnswer = []
  212.  
  213. def questionTimeout():
  214. global timeToServer, triviaStarted, currentAnswer, servingTrivia, currentQuestion, currentDifficulty
  215. timeLeft = int(timeToServe - (time.time() - triviaStarted))
  216. if timeLeft < 0 and servingTrivia:
  217. print(currentAnswer)
  218. try:
  219. sendMessage("Noone answered the question in time! The answer was: " + currentAnswer[0])
  220. except:
  221. print("We reacon there was a list range index here because the answer was already solved. We can safely ignore")
  222. servingTrivia = False
  223. triviaStarted = 0
  224. currentQuestion = ""
  225. currentDifficulty = 0
  226. currentAnswer = []
  227.  
  228. def storeLeaderboard():
  229. with open("data.json", "w") as f:
  230. json.dump(leaderboard, f)
  231.  
  232. def storeSteam():
  233. with open("steam.json", "w") as f:
  234. json.dump(steamIDs)
  235.  
  236. def checkPosition(player):
  237. positions = sorted(leaderboard, key=leaderboard.get, reverse=True)
  238. return positions.index(player) + 1
  239.  
  240.  
  241.  
  242. report = login()
  243. sendMessage("Hello. I'm a bot. Beep Boop. (Initialization Complete)", test=True)
  244. driver.execute_script('document.getElementsByClassName("text")[0].setAttribute("maxlength", "90000");')
  245. while 1:
  246. time.sleep(sleepTime)
  247. questionTimeout()
  248. messages = scrapeShoutbox()
  249. handleMessages(messages)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement