File: shortener.py

package info (click to toggle)
epic5 3.0.3-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 5,328 kB
  • sloc: ansic: 75,810; makefile: 648; ruby: 227; python: 215; sh: 78; perl: 13
file content (90 lines) | stat: -rw-r--r-- 2,676 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"""A URL shortening service running inside epic.
"""
import logging
from http.server import HTTPServer, BaseHTTPRequestHandler

from epic import EPIC_COMMIT_ID, EPIC_RELEASE_NAME, EPIC_RELEASE_VERSION, \
                 NOISE_QUIET, SocketServerMixin, alias, command, on, xecho, register_listener_callback

HOST_NAME = '127.0.0.1'
PORT_NUMBER = 8080
STATIC_URLS = {'/epic': 'http://epicsol.org/'}
LAST_RESORT = 'http://lmgtfy.com/?q=WTF%3F'
REDIRECTIONS = []
URL_FILE = 'irc_urls.txt'
__version__ = '0.1'
httpd = None
log = logging.getLogger(__name__)


def find_url(haystack):
    """Return any URL's within the haystack string.
    """
    results = []
    for word in haystack:
        if word.startswith('http:') or word.startswith('https:'):
            results.append(word)

    return results


@on('action', '*http:*', NOISE_QUIET)
@on('action', '*https:*', NOISE_QUIET)
@on('general_notice', '*http:*', NOISE_QUIET)
@on('general_notice', '*https:*', NOISE_QUIET)
@on('general_privmsg', '*http:*', NOISE_QUIET)
@on('general_privmsg', '*https:*', NOISE_QUIET)
@alias('shorten_url')
def url_handler(args):
    """Extract URL's from messages and create short URLs.
    """
    nick = args.split()[0]

    for url in find_url(args.split()):
        if url not in REDIRECTIONS:
            REDIRECTIONS.append(url)

        xecho('From %s: http://%s:%s/%s' % (nick, HOST_NAME, PORT_NUMBER, REDIRECTIONS.index(url)))


class RedirectHandler(BaseHTTPRequestHandler):
    def do_HEAD(self):
        if self.path in STATIC_URLS:
            location = STATIC_URLS.get(self.path)
        else:
            try:
                id = int(self.path[1:])
                if REDIRECTIONS and id < len(REDIRECTIONS):
                    location = REDIRECTIONS[id]
                else:
                    location = LAST_RESORT
            except ValueError:
                location = LAST_RESORT

        self.send_response(301)
        self.send_header("Location", location)
        self.end_headers()

    def do_GET(self):
        self.do_HEAD()

    def log_message(self, format, *args):
        """Direct all log messages to the client.
        """
        message = format % args
        log.info("%s - - [%s] %s", self.address_string(), self.log_date_time_string(), message)

    def version_string(self):
        """Returns the server version reported in headers.
        """
        return '%s %s epic5 %s (%s) (%s)' % (__name__, __version__, EPIC_RELEASE_VERSION, EPIC_RELEASE_NAME, EPIC_COMMIT_ID)


class EPICHTTPServer(SocketServerMixin, HTTPServer):
    pass


# Start the HTTP Server
httpd = EPICHTTPServer((HOST_NAME, PORT_NUMBER), RedirectHandler)

#skullY'2021