Browse Source

schematics and example scripts

Signed-off-by: CapsLock <faimaison@legeox.net>
CapsLock 9 years ago
parent
commit
76ade49d63
100 changed files with 9494 additions and 1 deletions
  1. 4 0
      .gitignore
  2. 15 1
      README.md
  3. 0 0
      examples/__init__.py
  4. 0 0
      examples/ircbot/__init__.py
  5. 153 0
      examples/ircbot/doorbot.py
  6. 13 0
      examples/ircbot/requirements.txt
  7. 80 0
      examples/ircbot/venv/bin/activate
  8. 42 0
      examples/ircbot/venv/bin/activate.csh
  9. 74 0
      examples/ircbot/venv/bin/activate.fish
  10. 34 0
      examples/ircbot/venv/bin/activate_this.py
  11. 11 0
      examples/ircbot/venv/bin/calc-prorate
  12. 11 0
      examples/ircbot/venv/bin/easy_install
  13. 11 0
      examples/ircbot/venv/bin/easy_install-3.4
  14. 11 0
      examples/ircbot/venv/bin/pip
  15. 11 0
      examples/ircbot/venv/bin/pip3
  16. 11 0
      examples/ircbot/venv/bin/pip3.4
  17. 1 0
      examples/ircbot/venv/bin/python
  18. BIN
      examples/ircbot/venv/bin/python3
  19. 1 0
      examples/ircbot/venv/bin/python3.4
  20. 1 0
      examples/ircbot/venv/include/python3.4m
  21. BIN
      examples/ircbot/venv/lib/python-wheels/chardet-2.3.0-py2.py3-none-any.whl
  22. BIN
      examples/ircbot/venv/lib/python-wheels/colorama-0.3.3-py2.py3-none-any.whl
  23. BIN
      examples/ircbot/venv/lib/python-wheels/distlib-0.2.1-py2.py3-none-any.whl
  24. BIN
      examples/ircbot/venv/lib/python-wheels/html5lib-0.999-py2.py3-none-any.whl
  25. BIN
      examples/ircbot/venv/lib/python-wheels/pip-1.5.6-py2.py3-none-any.whl
  26. BIN
      examples/ircbot/venv/lib/python-wheels/requests-2.7.0-py2.py3-none-any.whl
  27. BIN
      examples/ircbot/venv/lib/python-wheels/setuptools-18.4-py2.py3-none-any.whl
  28. BIN
      examples/ircbot/venv/lib/python-wheels/six-1.9.0-py2.py3-none-any.whl
  29. BIN
      examples/ircbot/venv/lib/python-wheels/urllib3-1.11-py2.py3-none-any.whl
  30. 1 0
      examples/ircbot/venv/lib/python3.4/__future__.py
  31. 1 0
      examples/ircbot/venv/lib/python3.4/_bootlocale.py
  32. 1 0
      examples/ircbot/venv/lib/python3.4/_collections_abc.py
  33. 1 0
      examples/ircbot/venv/lib/python3.4/_dummy_thread.py
  34. 1 0
      examples/ircbot/venv/lib/python3.4/_weakrefset.py
  35. 1 0
      examples/ircbot/venv/lib/python3.4/abc.py
  36. 1 0
      examples/ircbot/venv/lib/python3.4/base64.py
  37. 1 0
      examples/ircbot/venv/lib/python3.4/bisect.py
  38. 1 0
      examples/ircbot/venv/lib/python3.4/codecs.py
  39. 1 0
      examples/ircbot/venv/lib/python3.4/collections
  40. 1 0
      examples/ircbot/venv/lib/python3.4/config-3.4m-x86_64-linux-gnu
  41. 1 0
      examples/ircbot/venv/lib/python3.4/copy.py
  42. 1 0
      examples/ircbot/venv/lib/python3.4/copyreg.py
  43. 101 0
      examples/ircbot/venv/lib/python3.4/distutils/__init__.py
  44. 6 0
      examples/ircbot/venv/lib/python3.4/distutils/distutils.cfg
  45. 1 0
      examples/ircbot/venv/lib/python3.4/encodings
  46. 1 0
      examples/ircbot/venv/lib/python3.4/fnmatch.py
  47. 1 0
      examples/ircbot/venv/lib/python3.4/functools.py
  48. 1 0
      examples/ircbot/venv/lib/python3.4/genericpath.py
  49. 1 0
      examples/ircbot/venv/lib/python3.4/hashlib.py
  50. 1 0
      examples/ircbot/venv/lib/python3.4/heapq.py
  51. 1 0
      examples/ircbot/venv/lib/python3.4/hmac.py
  52. 1 0
      examples/ircbot/venv/lib/python3.4/imp.py
  53. 1 0
      examples/ircbot/venv/lib/python3.4/importlib
  54. 1 0
      examples/ircbot/venv/lib/python3.4/io.py
  55. 1 0
      examples/ircbot/venv/lib/python3.4/keyword.py
  56. 1 0
      examples/ircbot/venv/lib/python3.4/lib-dynload
  57. 1 0
      examples/ircbot/venv/lib/python3.4/linecache.py
  58. 1 0
      examples/ircbot/venv/lib/python3.4/locale.py
  59. 0 0
      examples/ircbot/venv/lib/python3.4/no-global-site-packages.txt
  60. 1 0
      examples/ircbot/venv/lib/python3.4/ntpath.py
  61. 1 0
      examples/ircbot/venv/lib/python3.4/operator.py
  62. 1 0
      examples/ircbot/venv/lib/python3.4/orig-prefix.txt
  63. 1 0
      examples/ircbot/venv/lib/python3.4/os.py
  64. 1 0
      examples/ircbot/venv/lib/python3.4/plat-x86_64-linux-gnu
  65. 1 0
      examples/ircbot/venv/lib/python3.4/posixpath.py
  66. 1 0
      examples/ircbot/venv/lib/python3.4/random.py
  67. 1 0
      examples/ircbot/venv/lib/python3.4/re.py
  68. 1 0
      examples/ircbot/venv/lib/python3.4/reprlib.py
  69. 1 0
      examples/ircbot/venv/lib/python3.4/rlcompleter.py
  70. 1 0
      examples/ircbot/venv/lib/python3.4/shutil.py
  71. 216 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/PKG-INFO
  72. 15 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/SOURCES.txt
  73. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/dependency_links.txt
  74. 8 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/installed-files.txt
  75. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/top_level.txt
  76. BIN
      examples/ircbot/venv/lib/python3.4/site-packages/RPi/GPIO.cpython-34m.so
  77. 0 0
      examples/ircbot/venv/lib/python3.4/site-packages/RPi/__init__.py
  78. 16 0
      examples/ircbot/venv/lib/python3.4/site-packages/_markerlib/__init__.py
  79. 119 0
      examples/ircbot/venv/lib/python3.4/site-packages/_markerlib/markers.py
  80. 5 0
      examples/ircbot/venv/lib/python3.4/site-packages/easy_install.py
  81. 1368 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/DESCRIPTION.rst
  82. 1393 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/METADATA
  83. 8 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/RECORD
  84. 6 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/WHEEL
  85. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/metadata.json
  86. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/top_level.txt
  87. 3130 0
      examples/ircbot/venv/lib/python3.4/site-packages/inflect.py
  88. 221 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/DESCRIPTION.rst
  89. 245 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/METADATA
  90. 47 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/RECORD
  91. 6 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/WHEEL
  92. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/metadata.json
  93. 1 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/top_level.txt
  94. 0 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/__init__.py
  95. 417 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/bot.py
  96. 132 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/buffer.py
  97. 1378 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/client.py
  98. 58 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/connection.py
  99. 71 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/ctcp.py
  100. 0 0
      examples/ircbot/venv/lib/python3.4/site-packages/irc/dict.py

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+*.swp
+.idea
+core
+*.pyc

+ 15 - 1
README.md

@@ -1,3 +1,17 @@
 # doorbot
 
-A bot to monitor your dc resources ;)
+A bot to monitor your dc resources ;)
+
+Door sensors are connected to : 
+
+ * GPIO 19 for back door
+ * GPIO 21 for front door
+
+Each of one with a pulldown resistor (to avoid electrical noise causing the read of varying values).
+
+Following demos are available in the examples folder
+
+ * ircbot : an irc bot sending door events of the back door and answering with front and back door state while asked with the command "porte"
+ * reading-door-sensors-events : an example of how to be notified when doors state changes without polling GPIOs
+ * reading-door-sensors-polling : an example of how to read doors state by polling GPIOs
+

+ 0 - 0
examples/__init__.py


+ 0 - 0
examples/ircbot/__init__.py


+ 153 - 0
examples/ircbot/doorbot.py

@@ -0,0 +1,153 @@
+#! /usr/bin/env python
+
+# This is an example of an IRC bot which :
+#   * Sends on IRC a message when a door is opened / closed
+#   * Answers to command "porte" by returning door state
+#
+# Door state is read from Raspberry PI GPIO using RPi.GPIO
+# GPIOs are set with GPIO.BOARD numbering scheme to be interoperable with various hardware versions
+#
+# WARNING : this a far away from state of art peace of code and
+# Example program using irc.bot.
+#
+# Joel Rosdahl <joel@rosdahl.net>
+
+
+import RPi.GPIO as GPIO
+import irc.bot
+import irc.strings
+from irc.client import ip_numstr_to_quad, ip_quad_to_numstr
+
+GPIO.setmode(GPIO.BOARD)
+GPIO.setup(21, GPIO.IN)
+GPIO.setup(19, GPIO.IN)
+
+server_hostname = "irc.geeknode.net"
+server_port = 6667
+irc_chan = "#faimaison"
+bot_name = "didier"
+
+
+def get_door_state():
+    state = []
+    state.append("[+] backdoor is opened" if GPIO.input(19) == 0 else "[ ] backdoor is closed")
+    state.append("[+] front door is opened" if GPIO.input(21) == 0 else "| ] front door is closed")
+    return state
+
+
+class TestBot(irc.bot.SingleServerIRCBot):
+    def __init__(self, channel, nickname, server, port=6667):
+        irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
+        self.channel = channel
+
+    def on_nicknameinuse(self, c, e):
+        c.nick(c.get_nickname() + "_")
+
+    def on_welcome(self, c, e):
+        c.join(self.channel)
+
+    def on_privmsg(self, c, e):
+        self.do_command(e, e.arguments[0])
+
+    def on_pubmsg(self, c, e):
+        a = e.arguments[0].split(":", 1)
+        if len(a) > 1 and irc.strings.lower(a[0]) == irc.strings.lower(self.connection.get_nickname()):
+            self.do_command(e, a[1].strip())
+        return
+
+    def on_dccmsg(self, c, e):
+        # non-chat DCC messages are raw bytes; decode as text
+        text = e.arguments[0].decode('utf-8')
+        c.privmsg("You said: " + text)
+
+    def on_dccchat(self, c, e):
+        if len(e.arguments) != 2:
+            return
+        args = e.arguments[1].split()
+        if len(args) == 4:
+            try:
+                address = ip_numstr_to_quad(args[2])
+                port = int(args[3])
+            except ValueError:
+                return
+            self.dcc_connect(address, port)
+
+    def send_msg(self, msg):
+        c = self.connection
+        print("ok msg %s" % msg)
+        c.privmsg(irc_chan, msg)
+
+    def do_command(self, e, cmd):
+        nick = e.source.nick
+        c = self.connection
+
+        # if cmd == "disconnect":
+        #    self.disconnect()
+        if cmd == "porte":
+            for s in get_door_state():
+                c.privmsg(irc_chan, "%s : %s" % (nick, s))
+        # elif cmd == "die":
+        #    self.die()
+        # elif cmd == "stats":
+        #    for chname, chobj in self.channels.items():
+        #        c.notice(nick, "--- Channel statistics ---")
+        #        c.notice(nick, "Channel: " + chname)
+        #        users = sorted(chobj.users())
+        #        c.notice(nick, "Users: " + ", ".join(users))
+        #        opers = sorted(chobj.opers())
+        #        c.notice(nick, "Opers: " + ", ".join(opers))
+        #        voiced = sorted(chobj.voiced())
+        #        c.notice(nick, "Voiced: " + ", ".join(voiced))
+        # elif cmd == "dcc":
+        #    dcc = self.dcc_listen()
+        #    c.ctcp("DCC", nick, "CHAT chat %s %d" % (
+        #        ip_quad_to_numstr(dcc.localaddress),
+        #        dcc.localport))
+        else:
+            c.privmsg(irc_chan, nick + " : Hein ? je comprend pas cette commande. Mes commandes sont : 'porte'")
+
+
+# !/usr/bin/env python3
+
+import time
+from time import sleep
+import RPi.GPIO as GPIO
+
+pin_back = 19
+pin_front = 21
+
+GPIO.setmode(GPIO.BOARD)
+GPIO.setup(pin_back, GPIO.IN)  # , pull_up_down=GPIO.PUD_DOWN)
+previous_state = None
+
+
+def main():
+    import sys
+    server = server_hostname
+    port = server_port
+    channel = irc_chan
+    nickname = bot_name
+
+    bot = TestBot(channel, nickname, server, port)
+    bot.connect(server, port, nickname)
+    bot.send_msg("hello world")
+
+    def my_callback(channel):
+        global previous_state
+        # time.sleep(0.2)  # confirm the movement by waiting 1.5 sec
+        pin_val = GPIO.input(pin_back)
+
+        if pin_val != previous_state:
+            previous_state = pin_val
+
+            if pin_val:  # and check again the input
+                bot.send_msg("[ ] CapsLock : DOOR CLOSED !")
+            else:
+                bot.send_msg("[+] CapsLock : DOOR OPENED !")
+
+    GPIO.add_event_detect(pin_back, GPIO.BOTH, callback=my_callback)
+    bot.start()
+
+
+if __name__ == "__main__":
+    main()

+ 13 - 0
examples/ircbot/requirements.txt

@@ -0,0 +1,13 @@
+RPi.GPIO==0.6.1
+inflect==0.2.5
+irc==13.3.1
+jaraco.classes==1.3
+jaraco.collections==1.3.1
+jaraco.functools==1.8.1
+jaraco.itertools==1.7.1
+jaraco.logging==1.3.1
+jaraco.text==1.6.3
+more-itertools==2.2
+pytz==2015.7
+six==1.10.0
+tempora==1.4

+ 80 - 0
examples/ircbot/venv/bin/activate

@@ -0,0 +1,80 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+    unset pydoc
+
+    # reset old environment variables
+    if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
+        PATH="$_OLD_VIRTUAL_PATH"
+        export PATH
+        unset _OLD_VIRTUAL_PATH
+    fi
+    if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
+        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
+        export PYTHONHOME
+        unset _OLD_VIRTUAL_PYTHONHOME
+    fi
+
+    # This should detect bash and zsh, which have a hash command that must
+    # be called to get it to forget past commands.  Without forgetting
+    # past commands the $PATH changes we made may not be respected
+    if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+        hash -r 2>/dev/null
+    fi
+
+    if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
+        PS1="$_OLD_VIRTUAL_PS1"
+        export PS1
+        unset _OLD_VIRTUAL_PS1
+    fi
+
+    unset VIRTUAL_ENV
+    if [ ! "$1" = "nondestructive" ] ; then
+    # Self destruct!
+        unset -f deactivate
+    fi
+}
+
+# unset irrelevant variables
+deactivate nondestructive
+
+VIRTUAL_ENV="/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/bin:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "$PYTHONHOME" ] ; then
+    _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
+    unset PYTHONHOME
+fi
+
+if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
+    _OLD_VIRTUAL_PS1="$PS1"
+    if [ "x" != x ] ; then
+        PS1="$PS1"
+    else
+    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
+        # special case for Aspen magic directories
+        # see http://www.zetadev.com/software/aspen/
+        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
+    else
+        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
+    fi
+    fi
+    export PS1
+fi
+
+alias pydoc="python -m pydoc"
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands.  Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+    hash -r 2>/dev/null
+fi

+ 42 - 0
examples/ircbot/venv/bin/activate.csh

@@ -0,0 +1,42 @@
+# This file must be used with "source bin/activate.csh" *from csh*.
+# You cannot run it directly.
+# Created by Davide Di Blasi <davidedb@gmail.com>.
+
+alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc'
+
+# Unset irrelevant variables.
+deactivate nondestructive
+
+setenv VIRTUAL_ENV "/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv"
+
+set _OLD_VIRTUAL_PATH="$PATH"
+setenv PATH "$VIRTUAL_ENV/bin:$PATH"
+
+
+
+if ("" != "") then
+    set env_name = ""
+else
+    if (`basename "$VIRTUAL_ENV"` == "__") then
+        # special case for Aspen magic directories
+        # see http://www.zetadev.com/software/aspen/
+        set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
+    else
+        set env_name = `basename "$VIRTUAL_ENV"`
+    endif
+endif
+
+# Could be in a non-interactive environment,
+# in which case, $prompt is undefined and we wouldn't
+# care about the prompt anyway.
+if ( $?prompt ) then
+    set _OLD_VIRTUAL_PROMPT="$prompt"
+    set prompt = "[$env_name] $prompt"
+endif
+
+unset env_name
+
+alias pydoc python -m pydoc
+
+rehash
+

+ 74 - 0
examples/ircbot/venv/bin/activate.fish

@@ -0,0 +1,74 @@
+# This file must be used with "source bin/activate.fish" *from fish* (http://fishshell.com)
+# you cannot run it directly
+
+function deactivate  -d "Exit virtualenv and return to normal shell environment"
+    # reset old environment variables
+    if test -n "$_OLD_VIRTUAL_PATH" 
+        set -gx PATH $_OLD_VIRTUAL_PATH
+        set -e _OLD_VIRTUAL_PATH
+    end
+    if test -n "$_OLD_VIRTUAL_PYTHONHOME"
+        set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
+        set -e _OLD_VIRTUAL_PYTHONHOME
+    end
+    
+    if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
+        # set an empty local fish_function_path, so fish_prompt doesn't automatically reload
+        set -l fish_function_path
+        # erase the virtualenv's fish_prompt function, and restore the original
+        functions -e fish_prompt
+        functions -c _old_fish_prompt fish_prompt
+        functions -e _old_fish_prompt
+        set -e _OLD_FISH_PROMPT_OVERRIDE
+    end
+    
+    set -e VIRTUAL_ENV
+    if test "$argv[1]" != "nondestructive"
+        # Self destruct!
+        functions -e deactivate
+    end
+end
+
+# unset irrelevant variables
+deactivate nondestructive
+
+set -gx VIRTUAL_ENV "/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv"
+
+set -gx _OLD_VIRTUAL_PATH $PATH
+set -gx PATH "$VIRTUAL_ENV/bin" $PATH
+
+# unset PYTHONHOME if set
+if set -q PYTHONHOME
+    set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
+    set -e PYTHONHOME
+end
+
+if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
+    # fish uses a function instead of an env var to generate the prompt.
+    
+    # copy the current fish_prompt function as the function _old_fish_prompt
+    functions -c fish_prompt _old_fish_prompt
+    
+    # with the original prompt function copied, we can override with our own.
+    function fish_prompt
+        # Prompt override?
+        if test -n ""
+            printf "%s%s" "" (set_color normal)
+            _old_fish_prompt
+            return
+        end
+        # ...Otherwise, prepend env
+        set -l _checkbase (basename "$VIRTUAL_ENV")
+        if test $_checkbase = "__"
+            # special case for Aspen magic directories
+            # see http://www.zetadev.com/software/aspen/
+            printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) 
+            _old_fish_prompt
+        else
+            printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
+            _old_fish_prompt
+        end
+    end 
+    
+    set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
+end

+ 34 - 0
examples/ircbot/venv/bin/activate_this.py

@@ -0,0 +1,34 @@
+"""By using execfile(this_file, dict(__file__=this_file)) you will
+activate this virtualenv environment.
+
+This can be used when you must use an existing Python interpreter, not
+the virtualenv bin/python
+"""
+
+try:
+    __file__
+except NameError:
+    raise AssertionError(
+        "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
+import sys
+import os
+
+old_os_path = os.environ['PATH']
+os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
+base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+if sys.platform == 'win32':
+    site_packages = os.path.join(base, 'Lib', 'site-packages')
+else:
+    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
+prev_sys_path = list(sys.path)
+import site
+site.addsitedir(site_packages)
+sys.real_prefix = sys.prefix
+sys.prefix = base
+# Move the added items to the front of the path:
+new_sys_path = []
+for item in list(sys.path):
+    if item not in prev_sys_path:
+        new_sys_path.append(item)
+        sys.path.remove(item)
+sys.path[:0] = new_sys_path

+ 11 - 0
examples/ircbot/venv/bin/calc-prorate

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from tempora import calculate_prorated_values
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(calculate_prorated_values())

+ 11 - 0
examples/ircbot/venv/bin/easy_install

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from setuptools.command.easy_install import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())

+ 11 - 0
examples/ircbot/venv/bin/easy_install-3.4

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from setuptools.command.easy_install import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())

+ 11 - 0
examples/ircbot/venv/bin/pip

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())

+ 11 - 0
examples/ircbot/venv/bin/pip3

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())

+ 11 - 0
examples/ircbot/venv/bin/pip3.4

@@ -0,0 +1,11 @@
+#!/home/legeox/Documents/Projects/doorbot/examples/ircbot/venv/bin/python3
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())

+ 1 - 0
examples/ircbot/venv/bin/python

@@ -0,0 +1 @@
+python3

BIN
examples/ircbot/venv/bin/python3


+ 1 - 0
examples/ircbot/venv/bin/python3.4

@@ -0,0 +1 @@
+python3

+ 1 - 0
examples/ircbot/venv/include/python3.4m

@@ -0,0 +1 @@
+/usr/include/python3.4m

BIN
examples/ircbot/venv/lib/python-wheels/chardet-2.3.0-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/colorama-0.3.3-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/distlib-0.2.1-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/html5lib-0.999-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/pip-1.5.6-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/requests-2.7.0-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/setuptools-18.4-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/six-1.9.0-py2.py3-none-any.whl


BIN
examples/ircbot/venv/lib/python-wheels/urllib3-1.11-py2.py3-none-any.whl


+ 1 - 0
examples/ircbot/venv/lib/python3.4/__future__.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/__future__.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/_bootlocale.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/_bootlocale.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/_collections_abc.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/_collections_abc.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/_dummy_thread.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/_dummy_thread.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/_weakrefset.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/_weakrefset.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/abc.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/abc.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/base64.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/base64.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/bisect.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/bisect.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/codecs.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/codecs.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/collections

@@ -0,0 +1 @@
+/usr/lib/python3.4/collections

+ 1 - 0
examples/ircbot/venv/lib/python3.4/config-3.4m-x86_64-linux-gnu

@@ -0,0 +1 @@
+/usr/lib/python3.4/config-3.4m-x86_64-linux-gnu

+ 1 - 0
examples/ircbot/venv/lib/python3.4/copy.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/copy.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/copyreg.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/copyreg.py

+ 101 - 0
examples/ircbot/venv/lib/python3.4/distutils/__init__.py

@@ -0,0 +1,101 @@
+import os
+import sys
+import warnings 
+import imp
+import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib
+              # Important! To work on pypy, this must be a module that resides in the
+              # lib-python/modified-x.y.z directory
+
+dirname = os.path.dirname
+
+distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
+if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)):
+    warnings.warn(
+        "The virtualenv distutils package at %s appears to be in the same location as the system distutils?")
+else:
+    __path__.insert(0, distutils_path)
+    real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY))
+    # Copy the relevant attributes
+    try:
+        __revision__ = real_distutils.__revision__
+    except AttributeError:
+        pass
+    __version__ = real_distutils.__version__
+
+from distutils import dist, sysconfig
+
+try:
+    basestring
+except NameError:
+    basestring = str
+
+## patch build_ext (distutils doesn't know how to get the libs directory
+## path on windows - it hardcodes the paths around the patched sys.prefix)
+
+if sys.platform == 'win32':
+    from distutils.command.build_ext import build_ext as old_build_ext
+    class build_ext(old_build_ext):
+        def finalize_options (self):
+            if self.library_dirs is None:
+                self.library_dirs = []
+            elif isinstance(self.library_dirs, basestring):
+                self.library_dirs = self.library_dirs.split(os.pathsep)
+            
+            self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs"))
+            old_build_ext.finalize_options(self)
+            
+    from distutils.command import build_ext as build_ext_module 
+    build_ext_module.build_ext = build_ext
+
+## distutils.dist patches:
+
+old_find_config_files = dist.Distribution.find_config_files
+def find_config_files(self):
+    found = old_find_config_files(self)
+    system_distutils = os.path.join(distutils_path, 'distutils.cfg')
+    #if os.path.exists(system_distutils):
+    #    found.insert(0, system_distutils)
+        # What to call the per-user config file
+    if os.name == 'posix':
+        user_filename = ".pydistutils.cfg"
+    else:
+        user_filename = "pydistutils.cfg"
+    user_filename = os.path.join(sys.prefix, user_filename)
+    if os.path.isfile(user_filename):
+        for item in list(found):
+            if item.endswith('pydistutils.cfg'):
+                found.remove(item)
+        found.append(user_filename)
+    return found
+dist.Distribution.find_config_files = find_config_files
+
+## distutils.sysconfig patches:
+
+old_get_python_inc = sysconfig.get_python_inc
+def sysconfig_get_python_inc(plat_specific=0, prefix=None):
+    if prefix is None:
+        prefix = sys.real_prefix
+    return old_get_python_inc(plat_specific, prefix)
+sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__
+sysconfig.get_python_inc = sysconfig_get_python_inc
+
+old_get_python_lib = sysconfig.get_python_lib
+def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+    if standard_lib and prefix is None:
+        prefix = sys.real_prefix
+    return old_get_python_lib(plat_specific, standard_lib, prefix)
+sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__
+sysconfig.get_python_lib = sysconfig_get_python_lib
+
+old_get_config_vars = sysconfig.get_config_vars
+def sysconfig_get_config_vars(*args):
+    real_vars = old_get_config_vars(*args)
+    if sys.platform == 'win32':
+        lib_dir = os.path.join(sys.real_prefix, "libs")
+        if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars:
+            real_vars['LIBDIR'] = lib_dir # asked for all
+        elif isinstance(real_vars, list) and 'LIBDIR' in args:
+            real_vars = real_vars + [lib_dir] # asked for list
+    return real_vars
+sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__
+sysconfig.get_config_vars = sysconfig_get_config_vars

+ 6 - 0
examples/ircbot/venv/lib/python3.4/distutils/distutils.cfg

@@ -0,0 +1,6 @@
+# This is a config file local to this virtualenv installation
+# You may include options that will be used by all distutils commands,
+# and by easy_install.  For instance:
+#
+#   [easy_install]
+#   find_links = http://mylocalsite

+ 1 - 0
examples/ircbot/venv/lib/python3.4/encodings

@@ -0,0 +1 @@
+/usr/lib/python3.4/encodings

+ 1 - 0
examples/ircbot/venv/lib/python3.4/fnmatch.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/fnmatch.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/functools.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/functools.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/genericpath.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/genericpath.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/hashlib.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/hashlib.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/heapq.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/heapq.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/hmac.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/hmac.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/imp.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/imp.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/importlib

@@ -0,0 +1 @@
+/usr/lib/python3.4/importlib

+ 1 - 0
examples/ircbot/venv/lib/python3.4/io.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/io.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/keyword.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/keyword.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/lib-dynload

@@ -0,0 +1 @@
+/usr/lib/python3.4/lib-dynload

+ 1 - 0
examples/ircbot/venv/lib/python3.4/linecache.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/linecache.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/locale.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/locale.py

+ 0 - 0
examples/ircbot/venv/lib/python3.4/no-global-site-packages.txt


+ 1 - 0
examples/ircbot/venv/lib/python3.4/ntpath.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/ntpath.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/operator.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/operator.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/orig-prefix.txt

@@ -0,0 +1 @@
+/usr

+ 1 - 0
examples/ircbot/venv/lib/python3.4/os.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/os.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/plat-x86_64-linux-gnu

@@ -0,0 +1 @@
+/usr/lib/python3.4/plat-x86_64-linux-gnu

+ 1 - 0
examples/ircbot/venv/lib/python3.4/posixpath.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/posixpath.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/random.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/random.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/re.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/re.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/reprlib.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/reprlib.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/rlcompleter.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/rlcompleter.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/shutil.py

@@ -0,0 +1 @@
+/usr/lib/python3.4/shutil.py

+ 216 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/PKG-INFO

@@ -0,0 +1,216 @@
+Metadata-Version: 1.1
+Name: RPi.GPIO
+Version: 0.6.1
+Summary: A module to control Raspberry Pi GPIO channels
+Home-page: http://sourceforge.net/projects/raspberry-gpio-python/
+Author: Ben Croston
+Author-email: ben@croston.org
+License: MIT
+Description: This package provides a class to control the GPIO on a Raspberry Pi.
+        
+        Note that this module is unsuitable for real-time or timing critical applications.  This is because you
+        can not predict when Python will be busy garbage collecting.  It also runs under the Linux kernel which
+        is not suitable for real time applications - it is multitasking O/S and another process may be given
+        priority over the CPU, causing jitter in your program.  If you are after true real-time performance and
+        predictability, buy yourself an Arduino http://www.arduino.cc !
+        
+        Note that the current release does not support SPI, I2C, hardware PWM or serial functionality on the RPi yet.
+        This is planned for the near future - watch this space!  One-wire functionality is also planned.
+        
+        Although hardware PWM is not available yet, software PWM is available to use on all channels.
+        
+        For examples and documentation, visit http://sourceforge.net/p/raspberry-gpio-python/wiki/Home/
+        
+        Change Log
+        ==========
+        
+        0.6.1
+        -----
+        - Update RPI_INFO to detect more board types
+        - Issue 118 - add_event_detect sometimes gives runtime error with unpriv user 
+        - Issue 120 - setmode() remembers invalid mode
+        
+        0.6.0a3
+        -------
+        - Now uses /dev/gpiomem if available to avoid being run as root
+        - Fix warnings with pull up/down on pins 3/5
+        - Correct base address on Pi 2 when devicetree is disabled
+        - caddr_t error on compile (Issue 109)
+        - Error on invalid parameters to setup() (issue 93)
+        - Add timeout parameter to wait_for_edge() (issue 91)
+        
+        0.5.11
+        ------
+        - Fix - pins > 26 missing when using BOARD mode
+        - Add getmode()
+        - Raise exception when a mix of modes is used
+        - GPIO.cleanaup() unsets the current pin mode
+        
+        0.5.10
+        ------
+        - Issue 95 - support RPi 2 boards
+        - Introduce RPI_INFO
+        - Deprecate RPI_REVISION
+        - Issue 97 - fixed docstring for setup()
+        
+        0.5.9
+        -----
+        - Issue 87 - warn about pull up/down on i2c pins
+        - Issue 86/75 - wait_for_edge() bugfix
+        - Issue 84 - recognise RPi properly when using a custom kernel
+        - Issue 90 - cleanup() on a list/tuple of channels
+        
+        0.5.8
+        -----
+        - Allow lists/tuples of channels in GPIO.setup()
+        - GPIO.output() now allows lists/tuples of values
+        - GPIO.wait_for_edge() bug fixes (issue 78)
+        
+        0.5.7
+        -----
+        - Issue 67 - speed up repeated calls to GPIO.wait_for_event()
+        - Added bouncetime keyword to GPIO.wait_for_event()
+        - Added extra edge/interrupt unit tests
+        - GPIO.wait_for_event() can now be mixed with GPIO.add_event_detect()
+        - Improved cleanups of events
+        - Issue 69 resolved
+        
+        0.5.6
+        -----
+        - Issue 68 - support for RPi Model B+
+        - Fix gpio_function()
+        
+        0.5.5
+        -----
+        - Issue 52 - 'unallocate' a channel
+        - Issue 35 - use switchbounce with GPIO.event_detected()
+        - Refactored events code
+        - Rewrote tests to use unittest mechanism and new test board with loopbacks
+        - Fixed adding events after a GPIO.cleanup()
+        - Issue 64 - misleading /dev/mem permissions error
+        - Issue 59 - name collision with PWM constant and class
+        
+        0.5.4
+        -----
+        - Changed release status (from alpha to full release)
+        - Warn when GPIO.cleanup() used with nothing to clean up (issue 44)
+        - Avoid collisions in constants (e.g. HIGH / RISING / PUD_DOWN)
+        - Accept BOARD numbers in gpio_function (issue 34)
+        - More return values for gpio_function (INPUT, OUTPUT, SPI, I2C, PWM, SERIAL, UNKNOWN)
+        - Tidy up docstrings
+        - Fix /dev/mem access error with gpio_function
+        
+        0.5.3a
+        ------
+        - Allow pydoc for non-root users (issue 27)
+        - Fix add_event_detect error when run as daemon (issue 32)
+        - Simplified exception types
+        - Changed from distribute to pip
+        
+        0.5.2a
+        ------
+        - Added software PWM (experimental)
+        - Added switch bounce handling to event callbacks
+        - Added channel number parameter to event callbacks (issue 31)
+        - Internal refactoring and code tidy up
+        
+        0.5.1a
+        ------
+        - Fixed callbacks for multiple GPIOs (issue 28)
+        
+        0.5.0a
+        ------
+        - Added new edge detection events (interrupt handling)
+          - Added add_event_detect()
+          - Added remove_event_detect()
+          - Added add_event_callback()
+          - Added wait_for_edge()
+        - Removed old experimental event functions
+          - Removed set_rising_event()
+          - Removed set_falling_event()
+          - Removed set_high_event()
+          - Removed set_low_event()
+        - Changed event_detected() for new edge detection functionality
+        - input() now returns 0/LOW == False or 1/HIGH == True (integers) instead of False or True (booleans).
+        - Fix error on repeated import (issue 3)
+        - Change SetupException to a RuntimeError so it can be caught on import (issue 25, Chris Hager <chris@linuxuser.at>)
+        - Improved docstrings of functions
+        
+        0.4.2a
+        ------
+        - Fix for installing on Arch Linux (Python 3.3) (issue 20)
+        - Initial value when setting a channel as an output (issue 19)
+        
+        0.4.1a
+        ------
+        - Added VERSION
+        - Permit input() of channels set as outputs (Eric Ptak <trouch@trouch.com>)
+        
+        0.4.0a
+        ------
+        - Added support for Revision 2 boards
+        - Added RPI_REVISION
+        - Added cleanup() function and removed automatic reset functionality on program exit
+        - Added get_function() to read existing GPIO channel functionality (suggestion from Eric Ptak <trouch@trouch.com>)
+        - Added set_rising_event()
+        - Added set_falling_event()
+        - Added set_high_event()
+        - Added set_low_event()
+        - Added event_detected()
+        - Added test/test.py
+        - Converted debian to armhf
+        - Fixed C function short_wait() (thanks to Thibault Porteboeuf <thibaultporteboeuf@gmail.com>)
+        
+        0.3.1a
+        ------
+        - Fixed critical bug with swapped high/low state on outputs
+        - Added pull-up / pull-down setup functionality for inputs
+        
+        0.3.0a
+        ------
+        - Rewritten as a C extension
+        - Now uses /dev/mem and SoC registers instead of /sys/class/gpio
+        - Faster!
+        - Make call to GPIO.setmode() mandatory
+        - Added GPIO.HIGH and GPIO.LOW constants
+        
+        0.2.0
+        -----
+        - Changed status from alpha to beta
+        - Added setmode() to be able to use BCM GPIO 00.nn channel numbers
+        - Renamed InvalidPinException to InvalidChannelException
+        
+        0.1.0
+        ------
+        - Fixed direction bug
+        - Added MANIFEST.in (to include missing file)
+        - Changed GPIO channel number to pin number
+        - Tested and working!
+        
+        0.0.3a
+        ------
+        - Added GPIO table
+        - Refactored
+        - Fixed a few critical bugs
+        - Still completely untested!
+        
+        0.0.2a
+        ------
+        - Internal refactoring.  Still completely untested!
+        
+        0.0.1a
+        ------
+        - First version.  Completely untested until I can get hold of a Raspberry Pi!
+        
+        
+Keywords: Raspberry Pi GPIO
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Operating System :: POSIX :: Linux
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development
+Classifier: Topic :: Home Automation
+Classifier: Topic :: System :: Hardware

+ 15 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/SOURCES.txt

@@ -0,0 +1,15 @@
+README.txt
+RPi/__init__.py
+RPi.GPIO.egg-info/PKG-INFO
+RPi.GPIO.egg-info/SOURCES.txt
+RPi.GPIO.egg-info/dependency_links.txt
+RPi.GPIO.egg-info/top_level.txt
+source/c_gpio.c
+source/common.c
+source/constants.c
+source/cpuinfo.c
+source/event_gpio.c
+source/py_gpio.c
+source/py_pwm.c
+source/soft_pwm.c
+test/test.py

+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/dependency_links.txt

@@ -0,0 +1 @@
+

+ 8 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/installed-files.txt

@@ -0,0 +1,8 @@
+../RPi/__init__.py
+../RPi/__pycache__/__init__.cpython-34.pyc
+../RPi/GPIO.cpython-34m.so
+./
+top_level.txt
+PKG-INFO
+dependency_links.txt
+SOURCES.txt

+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi.GPIO-0.6.1-py3.4.egg-info/top_level.txt

@@ -0,0 +1 @@
+RPi

BIN
examples/ircbot/venv/lib/python3.4/site-packages/RPi/GPIO.cpython-34m.so


+ 0 - 0
examples/ircbot/venv/lib/python3.4/site-packages/RPi/__init__.py


+ 16 - 0
examples/ircbot/venv/lib/python3.4/site-packages/_markerlib/__init__.py

@@ -0,0 +1,16 @@
+try:
+    import ast
+    from _markerlib.markers import default_environment, compile, interpret
+except ImportError:
+    if 'ast' in globals():
+        raise
+    def default_environment():
+        return {}
+    def compile(marker):
+        def marker_fn(environment=None, override=None):
+            # 'empty markers are True' heuristic won't install extra deps.
+            return not marker.strip()
+        marker_fn.__doc__ = marker
+        return marker_fn
+    def interpret(marker, environment=None, override=None):
+        return compile(marker)()

+ 119 - 0
examples/ircbot/venv/lib/python3.4/site-packages/_markerlib/markers.py

@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+"""Interpret PEP 345 environment markers.
+
+EXPR [in|==|!=|not in] EXPR [or|and] ...
+
+where EXPR belongs to any of those:
+
+    python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
+    python_full_version = sys.version.split()[0]
+    os.name = os.name
+    sys.platform = sys.platform
+    platform.version = platform.version()
+    platform.machine = platform.machine()
+    platform.python_implementation = platform.python_implementation()
+    a free string, like '2.6', or 'win32'
+"""
+
+__all__ = ['default_environment', 'compile', 'interpret']
+
+import ast
+import os
+import platform
+import sys
+import weakref
+
+_builtin_compile = compile
+
+try:
+    from platform import python_implementation
+except ImportError:
+    if os.name == "java":
+        # Jython 2.5 has ast module, but not platform.python_implementation() function.
+        def python_implementation():
+            return "Jython"
+    else:
+        raise
+
+
+# restricted set of variables
+_VARS = {'sys.platform': sys.platform,
+         'python_version': '%s.%s' % sys.version_info[:2],
+         # FIXME parsing sys.platform is not reliable, but there is no other
+         # way to get e.g. 2.7.2+, and the PEP is defined with sys.version
+         'python_full_version': sys.version.split(' ', 1)[0],
+         'os.name': os.name,
+         'platform.version': platform.version(),
+         'platform.machine': platform.machine(),
+         'platform.python_implementation': python_implementation(),
+         'extra': None # wheel extension
+        }
+
+for var in list(_VARS.keys()):
+    if '.' in var:
+        _VARS[var.replace('.', '_')] = _VARS[var]
+
+def default_environment():
+    """Return copy of default PEP 385 globals dictionary."""
+    return dict(_VARS)
+
+class ASTWhitelist(ast.NodeTransformer):
+    def __init__(self, statement):
+        self.statement = statement # for error messages
+
+    ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str)
+    # Bool operations
+    ALLOWED += (ast.And, ast.Or)
+    # Comparison operations
+    ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn)
+
+    def visit(self, node):
+        """Ensure statement only contains allowed nodes."""
+        if not isinstance(node, self.ALLOWED):
+            raise SyntaxError('Not allowed in environment markers.\n%s\n%s' %
+                               (self.statement,
+                               (' ' * node.col_offset) + '^'))
+        return ast.NodeTransformer.visit(self, node)
+
+    def visit_Attribute(self, node):
+        """Flatten one level of attribute access."""
+        new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx)
+        return ast.copy_location(new_node, node)
+
+def parse_marker(marker):
+    tree = ast.parse(marker, mode='eval')
+    new_tree = ASTWhitelist(marker).generic_visit(tree)
+    return new_tree
+
+def compile_marker(parsed_marker):
+    return _builtin_compile(parsed_marker, '<environment marker>', 'eval',
+                   dont_inherit=True)
+
+_cache = weakref.WeakValueDictionary()
+
+def compile(marker):
+    """Return compiled marker as a function accepting an environment dict."""
+    try:
+        return _cache[marker]
+    except KeyError:
+        pass
+    if not marker.strip():
+        def marker_fn(environment=None, override=None):
+            """"""
+            return True
+    else:
+        compiled_marker = compile_marker(parse_marker(marker))
+        def marker_fn(environment=None, override=None):
+            """override updates environment"""
+            if override is None:
+                override = {}
+            if environment is None:
+                environment = default_environment()
+            environment.update(override)
+            return eval(compiled_marker, environment)
+    marker_fn.__doc__ = marker
+    _cache[marker] = marker_fn
+    return _cache[marker]
+
+def interpret(marker, environment=None):
+    return compile(marker)(environment)

+ 5 - 0
examples/ircbot/venv/lib/python3.4/site-packages/easy_install.py

@@ -0,0 +1,5 @@
+"""Run the EasyInstall command"""
+
+if __name__ == '__main__':
+    from setuptools.command.easy_install import main
+    main()

File diff suppressed because it is too large
+ 1368 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/DESCRIPTION.rst


File diff suppressed because it is too large
+ 1393 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/METADATA


+ 8 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/RECORD

@@ -0,0 +1,8 @@
+inflect.py,sha256=qxbsGqcpIULJw2PqKkJCadnVIWQs7WaqrRb-AYpBY1g,100739
+inflect-0.2.5.dist-info/top_level.txt,sha256=m52ujdp10CqT6jh1XQxZT6kEntcnv-7Tl7UiGNTzWZA,8
+inflect-0.2.5.dist-info/METADATA,sha256=n3E7DKh8FeoyGWDlPky_q_Xu7iDpD6-fDC6EsshLC5U,50338
+inflect-0.2.5.dist-info/DESCRIPTION.rst,sha256=6p8Z2KowtZzB6-holOQROhtlSD7HmFDVun84cekSzVg,49314
+inflect-0.2.5.dist-info/metadata.json,sha256=nFj8byZQIr14t9JaPJTrsintlDMSu7c9XXMKlKU7_Xc,1106
+inflect-0.2.5.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110
+inflect-0.2.5.dist-info/RECORD,,
+__pycache__/inflect.cpython-34.pyc,,

+ 6 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.24.0)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

File diff suppressed because it is too large
+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/metadata.json


+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect-0.2.5.dist-info/top_level.txt

@@ -0,0 +1 @@
+inflect

File diff suppressed because it is too large
+ 3130 - 0
examples/ircbot/venv/lib/python3.4/site-packages/inflect.py


+ 221 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/DESCRIPTION.rst

@@ -0,0 +1,221 @@
+Internet Relay Chat (IRC) protocol client library
+-------------------------------------------------
+
+The home of irclib is:
+
+* https://github.com/jaraco/irc
+
+Documentation is available at:
+
+* https://pythonhosted.org/irc
+
+Change history is available at:
+
+* https://pythonhosted.org/irc/history.html
+
+You can `download project releases from PyPI
+<https://pypi.python.org/pypi/irc>`_.
+
+Tests are `continually run <https://travis-ci.org/#!/jaraco/irc>`_ using
+Travis-CI.
+
+|BuildStatus|_
+
+.. |BuildStatus| image:: https://secure.travis-ci.org/jaraco/irc.png
+.. _BuildStatus: https://travis-ci.org/jaraco/irc
+
+This library provides a low-level implementation of the IRC protocol for
+Python.  It provides an event-driven IRC client framework.  It has
+a fairly thorough support for the basic IRC protocol, CTCP, and DCC
+connections.
+
+In order to understand how to make an IRC client, it's best to read up first
+on the IRC specifications, available here:
+
+* http://www.irchelp.org/irchelp/rfc/
+
+Installation
+============
+
+IRC requires Python versions specified in the `download pages
+<https://pypi.python.org/pypi/irc>`_ and definitely supports Python 3.
+
+You have several options to install the IRC project.
+
+* Use ``easy_install irc`` or ``pip install irc`` to grab the latest
+  version from the cheeseshop (recommended).
+* Run ``python setup.py install`` (from the source distribution).
+
+Client Features
+===============
+
+The main features of the IRC client framework are:
+
+* Abstraction of the IRC protocol.
+* Handles multiple simultaneous IRC server connections.
+* Handles server PONGing transparently.
+* Messages to the IRC server are done by calling methods on an IRC
+  connection object.
+* Messages from an IRC server triggers events, which can be caught
+  by event handlers.
+* Reading from and writing to IRC server sockets is normally done
+  by an internal ``select()`` loop, but the ``select()`` may be done
+  by an external main loop.
+* Functions can be registered to execute at specified times by the
+  event-loop.
+* Decodes CTCP tagging correctly (hopefully); I haven't seen any
+  other IRC client implementation that handles the CTCP
+  specification subtilties.
+* A kind of simple, single-server, object-oriented IRC client class
+  that dispatches events to instance methods is included.
+* DCC connection support.
+
+Current limitations:
+
+* The IRC protocol shines through the abstraction a bit too much.
+* Data is not written asynchronously to the server (and DCC peers),
+  i.e. the ``write()`` may block if the TCP buffers are stuffed.
+* Like most projects, documentation is lacking ...
+
+Unfortunately, this library isn't as well-documented as I would like
+it to be.  I think the best way to get started is to read and
+understand the example program ``irccat``, which is included in the
+distribution.
+
+The following files might be of interest:
+
+* ``irc/client.py``
+
+  The library itself.  Read the code along with comments and
+  docstrings to get a grip of what it does.  Use it at your own risk
+  and read the source, Luke!
+
+* ``irc/bot.py``
+
+  An IRC bot implementation.
+
+* ``irc/server.py``
+
+  A basic IRC server implementation. Suitable for testing, but not
+  production quality.
+
+Examples
+========
+
+Example scripts in the scripts directory:
+
+* ``irccat``
+
+  A simple example of how to use the IRC client.  ``irccat`` reads
+  text from stdin and writes it to a specified user or channel on
+  an IRC server.
+
+* ``irccat2``
+
+  The same as above, but using the ``SimpleIRCClient`` class.
+
+* ``servermap``
+
+  Another simple example.  ``servermap`` connects to an IRC server,
+  finds out what other IRC servers there are in the net and prints
+  a tree-like map of their interconnections.
+
+* ``testbot``
+
+  An example bot that uses the ``SingleServerIRCBot`` class from
+  ``irc.bot``.  The bot enters a channel and listens for commands in
+  private messages or channel traffic.  It also accepts DCC
+  invitations and echos back sent DCC chat messages.
+
+* ``dccreceive``
+
+  Receives a file over DCC.
+
+* ``dccsend``
+
+  Sends a file over DCC.
+
+
+NOTE: If you're running one of the examples on a unix command line, you need
+to escape the ``#`` symbol in the channel. For example, use ``\\#test`` or
+``"#test"`` instead of ``#test``.
+
+Decoding Input
+==============
+
+By default, the IRC library attempts to decode all incoming streams as
+UTF-8, even though the IRC spec stipulates that no specific encoding can be
+expected. Since assuming UTF-8 is not reasonable in the general case, the IRC
+library provides options to customize decoding of input by customizing the
+``ServerConnection`` class. The ``buffer_class`` attribute on the
+``ServerConnection`` determines which class is used for buffering lines from the
+input stream. By default it is ``buffer.DecodingLineBuffer``, but may be
+re-assigned with another class, following the interface of ``buffer.LineBuffer``.
+The ``buffer_class`` attribute may be assigned for all instances of
+``ServerConnection`` by overriding the class attribute.
+
+For example:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class = irc.buffer.LenientDecodingLineBuffer
+
+The ``LenientDecodingLineBuffer`` attempts UTF-8 but falls back to latin-1, which
+will avoid ``UnicodeDecodeError`` in all cases (but may produce unexpected
+behavior if an IRC user is using another encoding).
+
+The buffer may be overridden on a per-instance basis (as long as it's
+overridden before the connection is established):
+
+.. code:: python
+
+    server = irc.client.IRC().server()
+    server.buffer_class = irc.buffer.LenientDecodingLineBuffer
+    server.connect()
+
+Alternatively, some clients may still want to decode the input using a
+different encoding. To decode all input as latin-1 (which decodes any input),
+use the following:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class.encoding = 'latin-1'
+
+Or decode to UTF-8, but use a replacement character for unrecognized byte
+sequences:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class.errors = 'replace'
+
+Or, to simply ignore all input that cannot be decoded:
+
+.. code:: python
+
+    class IgnoreErrorsBuffer(irc.buffer.DecodingLineBuffer):
+        def handle_exception(self):
+            pass
+    irc.client.ServerConnection.buffer_class = IgnoreErrorsBuffer
+
+On Python 2, it was possible to use the ``buffer.LineBuffer`` itself, which will
+pass the raw bytes. On Python 3, the library requires text for message
+processing, so a decoding buffer must be used. Therefore, use of the
+``LineBuffer`` is considered deprecated and not supported on Python 3. Clients
+should use one of the above techniques for decoding input to text.
+
+Notes and Contact Info
+======================
+
+Enjoy.
+
+Maintainer:
+Jason R. Coombs <jaraco@jaraco.com>
+
+Original Author:
+Joel Rosdahl <joel@rosdahl.net>
+
+Copyright © 1999-2002 Joel Rosdahl
+Copyright © 2011-2015 Jason R. Coombs
+Copyright © 2009 Ferry Boender
+
+

+ 245 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/METADATA

@@ -0,0 +1,245 @@
+Metadata-Version: 2.0
+Name: irc
+Version: 13.3.1
+Summary: IRC (Internet Relay Chat) protocol client library for Python
+Home-page: https://github.com/jaraco/irc
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+License: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Requires-Dist: jaraco.collections
+Requires-Dist: jaraco.functools (>=1.5)
+Requires-Dist: jaraco.itertools
+Requires-Dist: jaraco.logging
+Requires-Dist: jaraco.text
+Requires-Dist: pytz
+Requires-Dist: six
+
+Internet Relay Chat (IRC) protocol client library
+-------------------------------------------------
+
+The home of irclib is:
+
+* https://github.com/jaraco/irc
+
+Documentation is available at:
+
+* https://pythonhosted.org/irc
+
+Change history is available at:
+
+* https://pythonhosted.org/irc/history.html
+
+You can `download project releases from PyPI
+<https://pypi.python.org/pypi/irc>`_.
+
+Tests are `continually run <https://travis-ci.org/#!/jaraco/irc>`_ using
+Travis-CI.
+
+|BuildStatus|_
+
+.. |BuildStatus| image:: https://secure.travis-ci.org/jaraco/irc.png
+.. _BuildStatus: https://travis-ci.org/jaraco/irc
+
+This library provides a low-level implementation of the IRC protocol for
+Python.  It provides an event-driven IRC client framework.  It has
+a fairly thorough support for the basic IRC protocol, CTCP, and DCC
+connections.
+
+In order to understand how to make an IRC client, it's best to read up first
+on the IRC specifications, available here:
+
+* http://www.irchelp.org/irchelp/rfc/
+
+Installation
+============
+
+IRC requires Python versions specified in the `download pages
+<https://pypi.python.org/pypi/irc>`_ and definitely supports Python 3.
+
+You have several options to install the IRC project.
+
+* Use ``easy_install irc`` or ``pip install irc`` to grab the latest
+  version from the cheeseshop (recommended).
+* Run ``python setup.py install`` (from the source distribution).
+
+Client Features
+===============
+
+The main features of the IRC client framework are:
+
+* Abstraction of the IRC protocol.
+* Handles multiple simultaneous IRC server connections.
+* Handles server PONGing transparently.
+* Messages to the IRC server are done by calling methods on an IRC
+  connection object.
+* Messages from an IRC server triggers events, which can be caught
+  by event handlers.
+* Reading from and writing to IRC server sockets is normally done
+  by an internal ``select()`` loop, but the ``select()`` may be done
+  by an external main loop.
+* Functions can be registered to execute at specified times by the
+  event-loop.
+* Decodes CTCP tagging correctly (hopefully); I haven't seen any
+  other IRC client implementation that handles the CTCP
+  specification subtilties.
+* A kind of simple, single-server, object-oriented IRC client class
+  that dispatches events to instance methods is included.
+* DCC connection support.
+
+Current limitations:
+
+* The IRC protocol shines through the abstraction a bit too much.
+* Data is not written asynchronously to the server (and DCC peers),
+  i.e. the ``write()`` may block if the TCP buffers are stuffed.
+* Like most projects, documentation is lacking ...
+
+Unfortunately, this library isn't as well-documented as I would like
+it to be.  I think the best way to get started is to read and
+understand the example program ``irccat``, which is included in the
+distribution.
+
+The following files might be of interest:
+
+* ``irc/client.py``
+
+  The library itself.  Read the code along with comments and
+  docstrings to get a grip of what it does.  Use it at your own risk
+  and read the source, Luke!
+
+* ``irc/bot.py``
+
+  An IRC bot implementation.
+
+* ``irc/server.py``
+
+  A basic IRC server implementation. Suitable for testing, but not
+  production quality.
+
+Examples
+========
+
+Example scripts in the scripts directory:
+
+* ``irccat``
+
+  A simple example of how to use the IRC client.  ``irccat`` reads
+  text from stdin and writes it to a specified user or channel on
+  an IRC server.
+
+* ``irccat2``
+
+  The same as above, but using the ``SimpleIRCClient`` class.
+
+* ``servermap``
+
+  Another simple example.  ``servermap`` connects to an IRC server,
+  finds out what other IRC servers there are in the net and prints
+  a tree-like map of their interconnections.
+
+* ``testbot``
+
+  An example bot that uses the ``SingleServerIRCBot`` class from
+  ``irc.bot``.  The bot enters a channel and listens for commands in
+  private messages or channel traffic.  It also accepts DCC
+  invitations and echos back sent DCC chat messages.
+
+* ``dccreceive``
+
+  Receives a file over DCC.
+
+* ``dccsend``
+
+  Sends a file over DCC.
+
+
+NOTE: If you're running one of the examples on a unix command line, you need
+to escape the ``#`` symbol in the channel. For example, use ``\\#test`` or
+``"#test"`` instead of ``#test``.
+
+Decoding Input
+==============
+
+By default, the IRC library attempts to decode all incoming streams as
+UTF-8, even though the IRC spec stipulates that no specific encoding can be
+expected. Since assuming UTF-8 is not reasonable in the general case, the IRC
+library provides options to customize decoding of input by customizing the
+``ServerConnection`` class. The ``buffer_class`` attribute on the
+``ServerConnection`` determines which class is used for buffering lines from the
+input stream. By default it is ``buffer.DecodingLineBuffer``, but may be
+re-assigned with another class, following the interface of ``buffer.LineBuffer``.
+The ``buffer_class`` attribute may be assigned for all instances of
+``ServerConnection`` by overriding the class attribute.
+
+For example:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class = irc.buffer.LenientDecodingLineBuffer
+
+The ``LenientDecodingLineBuffer`` attempts UTF-8 but falls back to latin-1, which
+will avoid ``UnicodeDecodeError`` in all cases (but may produce unexpected
+behavior if an IRC user is using another encoding).
+
+The buffer may be overridden on a per-instance basis (as long as it's
+overridden before the connection is established):
+
+.. code:: python
+
+    server = irc.client.IRC().server()
+    server.buffer_class = irc.buffer.LenientDecodingLineBuffer
+    server.connect()
+
+Alternatively, some clients may still want to decode the input using a
+different encoding. To decode all input as latin-1 (which decodes any input),
+use the following:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class.encoding = 'latin-1'
+
+Or decode to UTF-8, but use a replacement character for unrecognized byte
+sequences:
+
+.. code:: python
+
+    irc.client.ServerConnection.buffer_class.errors = 'replace'
+
+Or, to simply ignore all input that cannot be decoded:
+
+.. code:: python
+
+    class IgnoreErrorsBuffer(irc.buffer.DecodingLineBuffer):
+        def handle_exception(self):
+            pass
+    irc.client.ServerConnection.buffer_class = IgnoreErrorsBuffer
+
+On Python 2, it was possible to use the ``buffer.LineBuffer`` itself, which will
+pass the raw bytes. On Python 3, the library requires text for message
+processing, so a decoding buffer must be used. Therefore, use of the
+``LineBuffer`` is considered deprecated and not supported on Python 3. Clients
+should use one of the above techniques for decoding input to text.
+
+Notes and Contact Info
+======================
+
+Enjoy.
+
+Maintainer:
+Jason R. Coombs <jaraco@jaraco.com>
+
+Original Author:
+Joel Rosdahl <joel@rosdahl.net>
+
+Copyright © 1999-2002 Joel Rosdahl
+Copyright © 2011-2015 Jason R. Coombs
+Copyright © 2009 Ferry Boender
+
+

+ 47 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/RECORD

@@ -0,0 +1,47 @@
+irc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+irc/bot.py,sha256=z02sv66bPSxYmXaotOwsvecdXTghITNpf5m8mQtCPek,12111
+irc/buffer.py,sha256=wn4CTm6Ev5NerHjji72TGtiuQxgvbLT3RPCK8xlX5CQ,3257
+irc/client.py,sha256=Y8FRf4r_MV42-vnX2P0YcvWljaUYmBMPtanVzctKhKU,44566
+irc/connection.py,sha256=voTUbw0RJb-Tuaf0fgBTKUUqlfwNFIy_1NUe-mE2G5o,1678
+irc/ctcp.py,sha256=buoH0H_WyGt97YoQJZ-OAsY454YKG4B2zS2cSIL636c,1796
+irc/dict.py,sha256=O7PASGuDBDqnLMZMIBrnQZiA3SQdVmZQRnchg3aa0Es,940
+irc/events.py,sha256=Csf6_F7vfk3pw2gXxEN1f1TwWhBykP4FSaS_8WXR8Ps,5003
+irc/features.py,sha256=1VdrS2-AF_D0f3HbmNma0xAI8tFCXHLDtQ-Q3qKfwa0,3145
+irc/functools.py,sha256=WbLEQMG19wXTnhuRtrCcZMaiElnikoLhqF-jGe4gGQI,1310
+irc/message.py,sha256=kXJI0WSEwELKQe9OZ186vInDNmEHGY6pLCbCzfSwJrE,1991
+irc/modes.py,sha256=RewAKFjtH9CzL_FNX7gVI2gSYxgPyCrrsK7O4dito_U,2495
+irc/rfc.py,sha256=9XMxRCAC6ElMEExnIvgW_SoriVEOk48wwEbbQg_KH1U,691
+irc/rfc2812.txt,sha256=kzdgMFdxbC50gJ6MV7VX7gvb_KYMxchS4kDfDlulNHk,122637
+irc/schedule.py,sha256=B_B0_8yxS2M6ue9Hvz8gMAKcvSLsg5FU3v9polPWO0g,3685
+irc/server.py,sha256=iq1QR96DTzvsY1Mwhwirp1grSH4tzp9IcxDJU22V9CM,17001
+irc/strings.py,sha256=5mJyG3DINeDQLD8E8Rr3Q276H0XwwSsMJ73uwpZd5wg,817
+irc/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+irc/tests/test_bot.py,sha256=04-p9Qv1Zb53LZHyRCGVjWKLAgtSX9bsxfdC30lSq08,3181
+irc/tests/test_client.py,sha256=DC6imiK1FQb4ocCjWBJifsutb9ksqgRGSjZKf-On1MM,1678
+irc/tests/test_schedule.py,sha256=kUdK_M-LPRe-iRYBe10Xx9yGAU2qcvETdLFIjdIZTJk,2341
+irc-13.3.1.dist-info/DESCRIPTION.rst,sha256=JO4HtODLlsxAzXFquE-jvf28JasbflXnXa4B6woWRZg,6890
+irc-13.3.1.dist-info/METADATA,sha256=KIlEBbbAsxAaUpTrZ2Rd9nPzDvqS_G5eUWSiXSxs-1s,7694
+irc-13.3.1.dist-info/RECORD,,
+irc-13.3.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110
+irc-13.3.1.dist-info/metadata.json,sha256=0_7rewsRO5niRz9VmhlW5vGWysC6a0PnWq0PDGmln_U,966
+irc-13.3.1.dist-info/top_level.txt,sha256=vxo2H5qss7B90aqdvkCZisJtlTkwB0HXSy2Vv63eEQw,4
+irc/__pycache__/strings.cpython-34.pyc,,
+irc/__pycache__/bot.cpython-34.pyc,,
+irc/__pycache__/__init__.cpython-34.pyc,,
+irc/__pycache__/server.cpython-34.pyc,,
+irc/__pycache__/features.cpython-34.pyc,,
+irc/__pycache__/ctcp.cpython-34.pyc,,
+irc/tests/__pycache__/test_bot.cpython-34.pyc,,
+irc/__pycache__/message.cpython-34.pyc,,
+irc/__pycache__/modes.cpython-34.pyc,,
+irc/__pycache__/schedule.cpython-34.pyc,,
+irc/tests/__pycache__/test_client.cpython-34.pyc,,
+irc/__pycache__/functools.cpython-34.pyc,,
+irc/__pycache__/dict.cpython-34.pyc,,
+irc/__pycache__/events.cpython-34.pyc,,
+irc/__pycache__/connection.cpython-34.pyc,,
+irc/__pycache__/buffer.cpython-34.pyc,,
+irc/tests/__pycache__/__init__.cpython-34.pyc,,
+irc/__pycache__/rfc.cpython-34.pyc,,
+irc/__pycache__/client.cpython-34.pyc,,
+irc/tests/__pycache__/test_schedule.cpython-34.pyc,,

+ 6 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.26.0)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

File diff suppressed because it is too large
+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/metadata.json


+ 1 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc-13.3.1.dist-info/top_level.txt

@@ -0,0 +1 @@
+irc

+ 0 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/__init__.py


+ 417 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/bot.py

@@ -0,0 +1,417 @@
+# -*- coding: utf-8 -*-
+
+"""
+Simple IRC bot library.
+
+This module contains a single-server IRC bot class that can be used to
+write simpler bots.
+"""
+
+from __future__ import absolute_import
+
+import sys
+import collections
+import itertools
+
+import irc.client
+import irc.modes
+from .dict import IRCDict
+
+class ServerSpec(object):
+    """
+    An IRC server specification.
+
+    >>> spec = ServerSpec('localhost')
+    >>> spec.host
+    'localhost'
+    >>> spec.port
+    6667
+    >>> spec.password
+
+    >>> spec = ServerSpec('127.0.0.1', 6697, 'fooP455')
+    >>> spec.password
+    'fooP455'
+    """
+    def __init__(self, host, port=6667, password=None):
+        self.host = host
+        self.port = port
+        self.password = password
+
+class SingleServerIRCBot(irc.client.SimpleIRCClient):
+    """A single-server IRC bot class.
+
+    The bot tries to reconnect if it is disconnected.
+
+    The bot keeps track of the channels it has joined, the other
+    clients that are present in the channels and which of those that
+    have operator or voice modes.  The "database" is kept in the
+    self.channels attribute, which is an IRCDict of Channels.
+    """
+    def __init__(self, server_list, nickname, realname,
+            reconnection_interval=60, **connect_params):
+        """Constructor for SingleServerIRCBot objects.
+
+        Arguments:
+
+            server_list -- A list of ServerSpec objects or tuples of
+                           parameters suitable for constructing ServerSpec
+                           objects. Defines the list of servers the bot will
+                           use (in order).
+
+            nickname -- The bot's nickname.
+
+            realname -- The bot's realname.
+
+            reconnection_interval -- How long the bot should wait
+                                     before trying to reconnect.
+
+            dcc_connections -- A list of initiated/accepted DCC
+            connections.
+
+            **connect_params -- parameters to pass through to the connect
+                                method.
+        """
+
+        super(SingleServerIRCBot, self).__init__()
+        self.__connect_params = connect_params
+        self.channels = IRCDict()
+        self.server_list = [
+            ServerSpec(*server)
+                if isinstance(server, (tuple, list))
+                else server
+            for server in server_list
+        ]
+        assert all(
+            isinstance(server, ServerSpec)
+            for server in self.server_list
+        )
+        if not reconnection_interval or reconnection_interval < 0:
+            reconnection_interval = 2 ** 31
+        self.reconnection_interval = reconnection_interval
+
+        self._nickname = nickname
+        self._realname = realname
+        for i in ["disconnect", "join", "kick", "mode",
+                  "namreply", "nick", "part", "quit"]:
+            self.connection.add_global_handler(i, getattr(self, "_on_" + i),
+                -20)
+
+    def _connected_checker(self):
+        """[Internal]"""
+        if not self.connection.is_connected():
+            self.connection.execute_delayed(self.reconnection_interval,
+                                            self._connected_checker)
+            self.jump_server()
+
+    def _connect(self):
+        """
+        Establish a connection to the server at the front of the server_list.
+        """
+        server = self.server_list[0]
+        try:
+            self.connect(server.host, server.port, self._nickname,
+                server.password, ircname=self._realname,
+                **self.__connect_params)
+        except irc.client.ServerConnectionError:
+            pass
+
+    def _on_disconnect(self, c, e):
+        self.channels = IRCDict()
+        self.connection.execute_delayed(self.reconnection_interval,
+                                        self._connected_checker)
+
+    def _on_join(self, c, e):
+        ch = e.target
+        nick = e.source.nick
+        if nick == c.get_nickname():
+            self.channels[ch] = Channel()
+        self.channels[ch].add_user(nick)
+
+    def _on_kick(self, c, e):
+        nick = e.arguments[0]
+        channel = e.target
+
+        if nick == c.get_nickname():
+            del self.channels[channel]
+        else:
+            self.channels[channel].remove_user(nick)
+
+    def _on_mode(self, c, e):
+        t = e.target
+        if not irc.client.is_channel(t):
+            # mode on self; disregard
+            return
+        ch = self.channels[t]
+
+        modes = irc.modes.parse_channel_modes(" ".join(e.arguments))
+        for sign, mode, argument in modes:
+            f = {"+": ch.set_mode, "-": ch.clear_mode}[sign]
+            f(mode, argument)
+
+    def _on_namreply(self, c, e):
+        """
+        e.arguments[0] == "@" for secret channels,
+                          "*" for private channels,
+                          "=" for others (public channels)
+        e.arguments[1] == channel
+        e.arguments[2] == nick list
+        """
+
+        ch_type, channel, nick_list = e.arguments
+
+        if channel == '*':
+            # User is not in any visible channel
+            # http://tools.ietf.org/html/rfc2812#section-3.2.5
+            return
+
+        for nick in nick_list.split():
+            nick_modes = []
+
+            if nick[0] in self.connection.features.prefix:
+                nick_modes.append(self.connection.features.prefix[nick[0]])
+                nick = nick[1:]
+
+            for mode in nick_modes:
+                self.channels[channel].set_mode(mode, nick)
+
+            self.channels[channel].add_user(nick)
+
+    def _on_nick(self, c, e):
+        before = e.source.nick
+        after = e.target
+        for ch in self.channels.values():
+            if ch.has_user(before):
+                ch.change_nick(before, after)
+
+    def _on_part(self, c, e):
+        nick = e.source.nick
+        channel = e.target
+
+        if nick == c.get_nickname():
+            del self.channels[channel]
+        else:
+            self.channels[channel].remove_user(nick)
+
+    def _on_quit(self, c, e):
+        nick = e.source.nick
+        for ch in self.channels.values():
+            if ch.has_user(nick):
+                ch.remove_user(nick)
+
+    def die(self, msg="Bye, cruel world!"):
+        """Let the bot die.
+
+        Arguments:
+
+            msg -- Quit message.
+        """
+
+        self.connection.disconnect(msg)
+        sys.exit(0)
+
+    def disconnect(self, msg="I'll be back!"):
+        """Disconnect the bot.
+
+        The bot will try to reconnect after a while.
+
+        Arguments:
+
+            msg -- Quit message.
+        """
+        self.connection.disconnect(msg)
+
+    def get_version(self):
+        """Returns the bot version.
+
+        Used when answering a CTCP VERSION request.
+        """
+        return "Python irc.bot ({version})".format(
+            version=irc.client.VERSION_STRING)
+
+    def jump_server(self, msg="Changing servers"):
+        """Connect to a new server, possibly disconnecting from the current.
+
+        The bot will skip to next server in the server_list each time
+        jump_server is called.
+        """
+        if self.connection.is_connected():
+            self.connection.disconnect(msg)
+
+        self.server_list.append(self.server_list.pop(0))
+        self._connect()
+
+    def on_ctcp(self, c, e):
+        """Default handler for ctcp events.
+
+        Replies to VERSION and PING requests and relays DCC requests
+        to the on_dccchat method.
+        """
+        nick = e.source.nick
+        if e.arguments[0] == "VERSION":
+            c.ctcp_reply(nick, "VERSION " + self.get_version())
+        elif e.arguments[0] == "PING":
+            if len(e.arguments) > 1:
+                c.ctcp_reply(nick, "PING " + e.arguments[1])
+        elif e.arguments[0] == "DCC" and e.arguments[1].split(" ", 1)[0] == "CHAT":
+            self.on_dccchat(c, e)
+
+    def on_dccchat(self, c, e):
+        pass
+
+    def start(self):
+        """Start the bot."""
+        self._connect()
+        super(SingleServerIRCBot, self).start()
+
+
+class Channel(object):
+    """
+    A class for keeping information about an IRC channel.
+    """
+
+    user_modes = 'ovqha'
+    """
+    Modes which are applicable to individual users, and which
+    should be tracked in the mode_users dictionary.
+    """
+
+    def __init__(self):
+        self._users = IRCDict()
+        self.mode_users = collections.defaultdict(IRCDict)
+        self.modes = {}
+
+    def users(self):
+        """Returns an unsorted list of the channel's users."""
+        return self._users.keys()
+
+    def opers(self):
+        """Returns an unsorted list of the channel's operators."""
+        return self.mode_users['o'].keys()
+
+    def voiced(self):
+        """Returns an unsorted list of the persons that have voice
+        mode set in the channel."""
+        return self.mode_users['v'].keys()
+
+    def owners(self):
+        """Returns an unsorted list of the channel's owners."""
+        return self.mode_users['q'].keys()
+
+    def halfops(self):
+        """Returns an unsorted list of the channel's half-operators."""
+        return self.mode_users['h'].keys()
+
+    def admins(self):
+        """Returns an unsorted list of the channel's admins."""
+        return self.mode_users['a'].keys()
+
+    def has_user(self, nick):
+        """Check whether the channel has a user."""
+        return nick in self._users
+
+    def is_oper(self, nick):
+        """Check whether a user has operator status in the channel."""
+        return nick in self.mode_users['o']
+
+    def is_voiced(self, nick):
+        """Check whether a user has voice mode set in the channel."""
+        return nick in self.mode_users['v']
+
+    def is_owner(self, nick):
+        """Check whether a user has owner status in the channel."""
+        return nick in self.mode_users['q']
+
+    def is_halfop(self, nick):
+        """Check whether a user has half-operator status in the channel."""
+        return nick in self.mode_users['h']
+
+    def is_admin(self, nick):
+        """Check whether a user has admin status in the channel."""
+        return nick in self.mode_users['a']
+
+    def add_user(self, nick):
+        self._users[nick] = 1
+
+    @property
+    def user_dicts(self):
+        yield self._users
+        for d in self.mode_users.values():
+            yield d
+
+    def remove_user(self, nick):
+        for d in self.user_dicts:
+            d.pop(nick, None)
+
+    def change_nick(self, before, after):
+        self._users[after] = self._users.pop(before)
+        for mode_lookup in self.mode_users.values():
+            if before in mode_lookup:
+                mode_lookup[after] = mode_lookup.pop(before)
+
+    def set_userdetails(self, nick, details):
+        if nick in self._users:
+            self._users[nick] = details
+
+    def set_mode(self, mode, value=None):
+        """Set mode on the channel.
+
+        Arguments:
+
+            mode -- The mode (a single-character string).
+
+            value -- Value
+        """
+        if mode in self.user_modes:
+            self.mode_users[mode][value] = 1
+        else:
+            self.modes[mode] = value
+
+    def clear_mode(self, mode, value=None):
+        """Clear mode on the channel.
+
+        Arguments:
+
+            mode -- The mode (a single-character string).
+
+            value -- Value
+        """
+        try:
+            if mode in self.user_modes:
+                del self.mode_users[mode][value]
+            else:
+                del self.modes[mode]
+        except KeyError:
+            pass
+
+    def has_mode(self, mode):
+        return mode in self.modes
+
+    def is_moderated(self):
+        return self.has_mode("m")
+
+    def is_secret(self):
+        return self.has_mode("s")
+
+    def is_protected(self):
+        return self.has_mode("p")
+
+    def has_topic_lock(self):
+        return self.has_mode("t")
+
+    def is_invite_only(self):
+        return self.has_mode("i")
+
+    def has_allow_external_messages(self):
+        return self.has_mode("n")
+
+    def has_limit(self):
+        return self.has_mode("l")
+
+    def limit(self):
+        if self.has_limit():
+            return self.modes["l"]
+        else:
+            return None
+
+    def has_key(self):
+        return self.has_mode("k")

+ 132 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/buffer.py

@@ -0,0 +1,132 @@
+# coding: utf-8
+
+from __future__ import unicode_literals, absolute_import
+
+import re
+import textwrap
+import logging
+
+
+log = logging.getLogger(__name__)
+
+
+class LineBuffer(object):
+    r"""
+    Buffer bytes read in from a connection and serve complete lines back.
+
+    >>> b = LineBuffer()
+    >>> len(b)
+    0
+
+    >>> b.feed(b'foo\nbar')
+    >>> len(b)
+    7
+    >>> list(b.lines()) == [b'foo']
+    True
+    >>> len(b)
+    3
+
+    >>> b.feed(b'bar\r\nbaz\n')
+    >>> list(b.lines()) == [b'barbar', b'baz']
+    True
+    >>> len(b)
+    0
+
+    The buffer will not perform any decoding.
+
+    >>> b.feed(b'Ol\xe9\n')
+    >>> list(b.lines()) == [b'Ol\xe9']
+    True
+
+    The LineBuffer should also act as an iterable.
+
+    >>> b.feed(b'iterate\nthis\n')
+    >>> for line, expected in zip(b, [b'iterate', b'this']):
+    ...    assert line == expected
+    """
+    line_sep_exp = re.compile(b'\r?\n')
+
+    def __init__(self):
+        self.buffer = b''
+
+    def feed(self, bytes):
+        self.buffer += bytes
+
+    def lines(self):
+        lines = self.line_sep_exp.split(self.buffer)
+        # save the last, unfinished, possibly empty line
+        self.buffer = lines.pop()
+        return iter(lines)
+
+    def __iter__(self):
+        return self.lines()
+
+    def __len__(self):
+        return len(self.buffer)
+
+class DecodingLineBuffer(LineBuffer):
+    r"""
+    Like LineBuffer, but decode the output (default assumes UTF-8).
+
+    >>> utf8_word = b'Ol\xc3\xa9'
+    >>> b = DecodingLineBuffer()
+    >>> b.feed(b'bar\r\nbaz\n' + utf8_word + b'\n')
+    >>> list(b.lines())
+    ['bar', 'baz', 'Ol\xe9']
+    >>> len(b)
+    0
+
+    Some clients will feed latin-1 or other encodings. If your client should
+    support docoding from these clients (and not raise a UnicodeDecodeError),
+    set errors='replace':
+
+    >>> b = DecodingLineBuffer()
+    >>> b.errors = 'replace'
+    >>> b.feed(b'Ol\xe9\n')
+    >>> list(b.lines()) == ['Ol\ufffd']
+    True
+
+    >>> b = DecodingLineBuffer()
+    >>> b.feed(b'Ol\xe9\n')
+    >>> list(b.lines())
+    Traceback (most recent call last):
+    ...
+    UnicodeDecodeError: ...
+    """
+    encoding = 'utf-8'
+    errors = 'strict'
+
+    def lines(self):
+        for line in super(DecodingLineBuffer, self).lines():
+            try:
+                yield line.decode(self.encoding, self.errors)
+            except UnicodeDecodeError:
+                self.handle_exception()
+
+    def handle_exception(self):
+        msg = textwrap.dedent("""
+            Unknown encoding encountered. See 'Decoding Input'
+            in https://pypi.python.org/pypi/irc for details.
+            """)
+        log.warning(msg)
+        raise
+
+class LenientDecodingLineBuffer(LineBuffer):
+    r"""
+    Like LineBuffer, but decode the output. First try UTF-8 and if that
+    fails, use latin-1, which decodes all byte strings.
+
+    >>> b = LenientDecodingLineBuffer()
+    >>> utf8_word = b'Ol\xc3\xa9'
+    >>> b.feed(utf8_word + b'\n')
+    >>> b.feed(b'Ol\xe9\n')
+    >>> list(b.lines())
+    ['Ol\xe9', 'Ol\xe9']
+    """
+
+    def lines(self):
+        for line in super(LenientDecodingLineBuffer, self).lines():
+            try:
+                yield line.decode('utf-8', 'strict')
+            except UnicodeDecodeError:
+                yield line.decode('latin-1')

File diff suppressed because it is too large
+ 1378 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/client.py


+ 58 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/connection.py

@@ -0,0 +1,58 @@
+from __future__ import absolute_import
+
+import socket
+import importlib
+
+identity = lambda x: x
+
+class Factory(object):
+    """
+    A class for creating custom socket connections.
+
+    To create a simple connection:
+
+        server_address = ('localhost', 80)
+        Factory()(server_address)
+
+    To create an SSL connection:
+
+        Factory(wrapper=ssl.wrap_socket)(server_address)
+
+    To create an SSL connection with parameters to wrap_socket:
+
+        wrapper = functools.partial(ssl.wrap_socket, ssl_cert=get_cert())
+        Factory(wrapper=wrapper)(server_address)
+
+    To create an IPv6 connection:
+
+        Factory(ipv6=True)(server_address)
+
+    Note that Factory doesn't save the state of the socket itself. The
+    caller must do that, as necessary. As a result, the Factory may be
+    re-used to create new connections with the same settings.
+
+    """
+
+    family = socket.AF_INET
+
+    def __init__(self, bind_address=('', 0), wrapper=identity, ipv6=False):
+        self.bind_address = bind_address
+        self.wrapper = wrapper
+        if ipv6:
+            self.family = socket.AF_INET6
+
+    def from_legacy_params(self, localaddress='', localport=0, ssl=False,
+            ipv6=False):
+        if localaddress or localport:
+            self.bind_address = (localaddress, localport)
+        if ssl:
+            self.wrapper = importlib.import_module('ssl').wrap_socket
+        if ipv6:
+            self.family = socket.AF_INET6
+
+    def connect(self, server_address):
+        sock = self.wrapper(socket.socket(self.family, socket.SOCK_STREAM))
+        sock.bind(self.bind_address)
+        sock.connect(server_address)
+        return sock
+    __call__ = connect

+ 71 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/ctcp.py

@@ -0,0 +1,71 @@
+from __future__ import absolute_import
+
+import re
+
+LOW_LEVEL_QUOTE = '\x10'
+LEVEL_QUOTE = "\\"
+DELIMITER = '\x01'
+
+low_level_mapping = {
+    "0": '\x00',
+    "n": "\n",
+    "r": "\r",
+    LEVEL_QUOTE: LEVEL_QUOTE
+}
+
+low_level_regexp = re.compile(LOW_LEVEL_QUOTE + "(.)")
+
+def _low_level_replace(match_obj):
+    ch = match_obj.group(1)
+
+    # If low_level_mapping doesn't have the character as key, we
+    # should just return the character.
+    return low_level_mapping.get(ch, ch)
+
+
+def dequote(message):
+    """
+    Dequote a message according to CTCP specifications.
+
+    The function returns a list where each element can be either a
+    string (normal message) or a tuple of one or two strings (tagged
+    messages).  If a tuple has only one element (ie is a singleton),
+    that element is the tag; otherwise the tuple has two elements: the
+    tag and the data.
+
+    Arguments:
+
+        message -- The message to be decoded.
+    """
+
+    # Perform the substitution
+    message = low_level_regexp.sub(_low_level_replace, message)
+
+    if DELIMITER not in message:
+        return [message]
+
+    # Split it into parts.
+    chunks = message.split(DELIMITER)
+
+    return list(_gen_messages(chunks))
+
+
+def _gen_messages(chunks):
+    i = 0
+    while i < len(chunks) - 1:
+        # Add message if it's non-empty.
+        if len(chunks[i]) > 0:
+            yield chunks[i]
+
+        if i < len(chunks) - 2:
+            # Aye!  CTCP tagged data ahead!
+            yield tuple(chunks[i + 1].split(" ", 1))
+
+        i = i + 2
+
+    if len(chunks) % 2 == 0:
+        # Hey, a lonely _CTCP_DELIMITER at the end!  This means
+        # that the last chunk, including the delimiter, is a
+        # normal message!  (This is according to the CTCP
+        # specification.)
+        yield DELIMITER + chunks[-1]

+ 0 - 0
examples/ircbot/venv/lib/python3.4/site-packages/irc/dict.py


Some files were not shown because too many files changed in this diff