summaryrefslogtreecommitdiff
path: root/chat_iface.py
diff options
context:
space:
mode:
authorAlex Xu <alex_y_xu@yahoo.ca>2014-01-08 14:05:40 -0500
committerAlex Xu <alex_y_xu@yahoo.ca>2014-01-08 14:05:40 -0500
commite9b4130fb4e5f5f1c1aed2f52ce97453dadbc2df (patch)
tree6fb7aa7e5d4517d97290f415cf92b83da63af654 /chat_iface.py
downloadrschat-master.tar.xz
rschat-master.zip
Initial commitHEADmaster
Diffstat (limited to 'chat_iface.py')
-rw-r--r--chat_iface.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/chat_iface.py b/chat_iface.py
new file mode 100644
index 0000000..c1fbc29
--- /dev/null
+++ b/chat_iface.py
@@ -0,0 +1,71 @@
+from __future__ import unicode_literals
+import logging
+import selenium.webdriver
+
+# set WebElement hash to default to use set(x)
+selenium.webdriver.remote.webelement.WebElement.__hash__ = lambda self: hash(self.id)
+
+def diff(a, b):
+ b = set(b)
+ return [aa for aa in a if aa not in b]
+
+logger = logging.getLogger('rschat.' + __name__)
+
+class ChatInterface():
+ def __init__(self, chat_type, username, password):
+ self.chat_type = chat_type
+ self.username = username
+ self.password = password
+ self.browser = None
+
+ def __enter__(self):
+ logger.info('Starting webdriver')
+ options = selenium.webdriver.ChromeOptions()
+ options.add_argument('--disable-file-system')
+
+ self.browser = selenium.webdriver.Chrome('/usr/lib64/chromium-browser/chromedriver', chrome_options=options)
+
+ self.browser.implicitly_wait(30)
+
+ logger.debug('Navigating to companion app')
+ self.browser.get('http://www.runescape.com/companion/comapp.ws')
+
+ logger.debug('Switching to iframe')
+ self.browser.switch_to_frame(self.browser.find_element_by_tag_name('iframe'))
+
+# login
+ logger.debug('Logging in as %s' % self.username)
+ self.browser.find_element_by_id('username').send_keys(self.username)
+ self.browser.find_element_by_id('password').send_keys(self.password)
+ self.browser.find_element_by_tag_name('form').submit()
+
+# decline remember login
+ logger.debug('Declining remember login')
+ self.browser.find_element_by_partial_link_text('No').click()
+
+ logger.debug('Switching to %s chat' % self.chat_type)
+ self.browser.find_element_by_css_selector('.chat-nav .icon-%schat' % self.chat_type).click()
+
+ self.browser.implicitly_wait(0)
+
+ return self
+
+ lastmsgs = []
+
+ def send(self, line):
+ self.browser.find_element_by_id('message').send_keys(line)
+ self.browser.find_element_by_tag_name('form').submit()
+
+ def poll(self):
+ try:
+ allmsgs = self.browser.find_elements_by_css_selector('#content-%s-chat .message:not(.my-message) .message-content' % self.chat_type)
+ newmsgs = diff(allmsgs, self.lastmsgs)
+
+ self.lastmsgs = allmsgs
+
+ return [(e.find_element_by_class_name('author').text.replace(' -', ''), e.find_element_by_tag_name('p').text) for e in newmsgs]
+ except selenium.webdriver.common.exceptions.NoSuchElementException:
+ pass
+
+ def __exit__(self, *_):
+ self.browser.quit()