plugins, parsing threads list with BeautifulSoup
[chanspy.git] / server / server.py
blob61d5b9707be71a1ec554e151b567f660fc7576b9
1 # -*- coding: utf-8 -*-
3 # Based on webserver.py by Jon Berg (turtlemeat.com)
5 import sys
6 import os
7 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
8 import mimetypes
10 from html_generation import *
11 import misc
13 # some constants
14 htdocs_dir = u'htdocs'
15 server = None
16 settings = None
17 plugins = None
19 #---------------------------------------------#
20 class MyHandler(BaseHTTPRequestHandler):
21 def do_GET(self):
22 data = None
23 ### actions starts with «/?»
24 if self.path.startswith('/?'):
25 action = self.path[2:]
27 if action == 'settings':
28 data = ('Унью!',)
29 elif action == 'chans':
30 chans_list = get_chans_list()
31 data = (get_chans_html(chans_list),)
32 else:
33 self.send_error(501, 'Bad action: %s' %action)
34 else:
35 path = '%s%s' %(htdocs_dir, self.path)
36 if os.path.isdir(path): path += '/index.html'
38 ### physical file
39 if os.path.exists(path):
40 f = open(path)
41 data = (f.read(), self.get_content_type(path))
42 f.close()
43 else:
44 print self.path
45 args = filter(None, self.path.split('/'))
46 print args
48 ### /chan/
49 if len(args) == 1:
50 boards_list = get_boards_list(args[0])
51 if boards_list:
52 data = (get_boards_html(boards_list),)
53 else:
54 self.send_error(501, u'Can\'t find boards on %s' %args[0])
55 ### /chan/board/
56 elif len(args) == 2:
57 plugin = get_plugin(args[0], args[1])
58 if plugin:
59 threads_list = plugin.get_threads_list(args[0], args[1], get_chan_settings(args[0]))
60 data = (get_threads_html(threads_list, args[0], args[1]),)
61 else:
62 self.send_error(501, u'Can\'t find plugin for %s/%s/' %(args[0], args[1]))
63 else:
64 self.send_error(404, u'File not found: %s' %path)
66 if data:
67 if len(data) == 1: data = (data[0], 'text/html')
69 self.send_response(200)
70 self.send_header(u'Content-type', data[1])
71 self.end_headers()
72 self.wfile.write(misc.to_bytes(data[0]))
74 def get_content_type(self, filename):
75 return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
77 #---------------------------------------------#
78 def start_server(_settings, _plugins):
79 global server, settings, plugins
80 settings = _settings
81 plugins = _plugins
83 server = HTTPServer(('', settings['daemon']['port']), MyHandler)
84 server.serve_forever()
86 #---------------------------------------------#
87 def stop_server():
88 global server
89 server.socket.close()
91 ###############################################
92 def get_chans_list():
93 chans_list = []
94 for chan_item in settings['chans']:
95 chan_name = chan_item.items()[0][0]
96 chans_list.append((chan_name, u'/%s/' %chan_name))
98 return chans_list
100 def get_boards_list(_chan_name):
101 boards_list = []
102 for chan_item in settings['chans']:
103 chan_name, chan_settings = chan_item.items()[0]
104 if _chan_name == chan_name:
105 for board_item in chan_settings['boards']:
106 board_name = board_item.items()[0][0]
107 boards_list.append((board_name, u'/%s/%s/' %(chan_name, board_name)))
109 return boards_list
111 def get_plugin(_chan_name, _board_name):
112 for chan_item in settings['chans']:
113 chan_name, chan_settings = chan_item.items()[0]
114 if _chan_name == chan_name:
115 for board_item in chan_settings['boards']:
116 board_name, board_settings = board_item.items()[0]
117 if _board_name == board_name:
118 plugin_name = board_settings['type']
119 if plugins.has_key(plugin_name):
120 return plugins[plugin_name]
122 def get_chan_settings(_chan_name):
123 for chan_item in settings['chans']:
124 chan_name, chan_settings = chan_item.items()[0]
125 if _chan_name == chan_name:
126 return chan_settings