app.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. from flask import Flask, request, session, render_template
  2. app = Flask(__name__)
  3. from urllib import parse
  4. import json
  5. import pymysql
  6. import time
  7. import re
  8. json_data=open('set.json').read()
  9. data = json.loads(json_data)
  10. conn = pymysql.connect(host = data['host'], user = data['user'], password = data['pw'], db = data['db'], charset = 'utf8')
  11. curs = conn.cursor(pymysql.cursors.DictCursor)
  12. def namumark(data):
  13. data = '\n' + data + '\n'
  14. data = re.sub('<', '&lt;', data)
  15. data = re.sub('>', '&gt;', data)
  16. data = re.sub("======\s?(?P<in>[^=]*)\s?======(?:\s+)?\n", '<h6>\g<in></h6>', data)
  17. data = re.sub("=====\s?(?P<in>[^=]*)\s?=====(?:\s+)?\n", '<h5>\g<in></h5>', data)
  18. data = re.sub("====\s?(?P<in>[^=]*)\s?====(?:\s+)?\n", '<h4>\g<in></h4>', data)
  19. data = re.sub("===\s?(?P<in>[^=]*)\s?===(?:\s+)?\n", '<h3>\g<in></h3>', data)
  20. data = re.sub("==\s?(?P<in>[^=]*)\s?==(?:\s+)?\n", '<h2>\g<in></h2>', data)
  21. data = re.sub("=\s?(?P<in>[^=]*)\s?=(?:\s+)?\n", '<h1>\g<in></h1>', data)
  22. data = re.sub("'''(?P<in>.+?)'''(?!')", '<strong>\g<in></strong>', data)
  23. data = re.sub("''(?P<in>.+?)''(?!')", '<i>\g<in></i>', data)
  24. data = re.sub('~~(?P<in>.+?)~~(?!~)', '<s>\g<in></s>', data)
  25. data = re.sub('--(?P<in>.+?)--(?!-)', '<s>\g<in></s>', data)
  26. data = re.sub('__(?P<in>.+?)__(?!_)', '<u>\g<in></u>', data)
  27. data = re.sub('\^\^(?P<in>.+?)\^\^(?!\^)', '<sup>\g<in></sup>', data)
  28. data = re.sub(',,(?P<in>.+?),,(?!,)', '<sub>\g<in></sub>', data)
  29. data = re.sub('\n', '<br>', data)
  30. return data
  31. def getip(request):
  32. if request.headers.getlist("X-Forwarded-For"):
  33. ip = request.headers.getlist("X-Forwarded-For")[0]
  34. else:
  35. ip = request.remote_addr
  36. return ip
  37. def getnow():
  38. now = time.localtime()
  39. s = "%04d-%02d-%02d %02d:%02d:%02d" % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)
  40. return s
  41. def recent(title, ip, today, send, leng):
  42. curs.execute("insert into rc (title, date, ip, send, leng, back) value ('" + pymysql.escape_string(title) + "', '" + today + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "', '')")
  43. conn.commit()
  44. def discuss(title, sub, ip, date):
  45. curs.execute("insert into rd (title, sub, ip, date) value ('" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(sub) + "', '" + ip + "', '" + date + "')")
  46. conn.commit()
  47. def history(title, data, date, ip, send, leng):
  48. curs.execute("select * from history where title = '" + pymysql.escape_string(title) + "' order by id+0 desc limit 1")
  49. rows = curs.fetchall()
  50. if(rows):
  51. number = int(rows[0]['id']) + 1
  52. curs.execute("insert into history (id, title, data, date, ip, send, leng) value ('" + str(number) + "', '" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(data) + "', '" + date + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "')")
  53. conn.commit()
  54. else:
  55. curs.execute("insert into history (id, title, data, date, ip, send, leng) value ('1', '" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(data) + "', '" + date + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "')")
  56. conn.commit()
  57. def getleng(existing, change):
  58. if(existing < change):
  59. leng = change - existing
  60. leng = '+' + str(leng)
  61. elif(change < existing):
  62. leng = existing - change
  63. leng = '-' + str(leng)
  64. else:
  65. leng = '0'
  66. return leng;
  67. @app.route('/')
  68. @app.route('/w/')
  69. def redirect():
  70. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  71. @app.route('/recentchanges')
  72. def recentchanges():
  73. i = 0
  74. div = '<div>'
  75. curs.execute("select * from rc order by date desc limit 50")
  76. rows = curs.fetchall()
  77. if(rows):
  78. while True:
  79. try:
  80. a = rows[i]
  81. except:
  82. div = div + '</div>'
  83. break
  84. if(rows[i]['send']):
  85. send = rows[i]['send']
  86. send = re.sub('<', '&lt;', send)
  87. send = re.sub('>', '&gt;', send)
  88. send = re.sub('&lt;a href="\/w\/(?P<in>[^"]*)"&gt;(?P<out>[^&]*)&lt;\/a&gt;', '<a href="/w/\g<in>">\g<out></a>', send)
  89. else:
  90. send = '<br>'
  91. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + parse.quote(rows[i]['title']) + '">' + rows[i]['title'] + '</a> <a href="/history/' + parse.quote(rows[i]['title']) + '">(역사)</a> (' + rows[i]['leng'] + ')</td><td style="text-align: center;width:33.33%;">' + rows[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  92. i = i + 1
  93. return render_template('index.html', logo = data['name'], rows = div, tn = 3, title = '최근 변경내역')
  94. else:
  95. return render_template('index.html', logo = data['name'], rows = '', tn = 3, title = '최근 변경내역')
  96. @app.route('/recentdiscuss')
  97. def recentdiscuss():
  98. i = 0
  99. div = '<div>'
  100. curs.execute("select * from rd order by date desc limit 50")
  101. rows = curs.fetchall()
  102. if(rows):
  103. while True:
  104. try:
  105. a = rows[i]
  106. except:
  107. div = div + '</div>'
  108. break
  109. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/topic/' + parse.quote(rows[i]['title']) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['title'] + '</a> (' + rows[i]['sub'] + ')</td><td style="text-align: center;width:33.33%;">' + rows[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr></tbody></table>'
  110. i = i + 1
  111. return render_template('index.html', logo = data['name'], rows = div, tn = 12, title = '최근 토론내역')
  112. else:
  113. return render_template('index.html', logo = data['name'], rows = '', tn = 12, title = '최근 토론내역')
  114. @app.route('/history/<name>')
  115. def gethistory(name = None):
  116. i = 0
  117. div = '<div>'
  118. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' order by date desc")
  119. rows = curs.fetchall()
  120. if(rows):
  121. while True:
  122. try:
  123. a = rows[i]
  124. except:
  125. div = div + '</div>'
  126. break
  127. if(rows[i]['send']):
  128. send = rows[i]['send']
  129. send = re.sub('<', '&lt;', send)
  130. send = re.sub('>', '&gt;', send)
  131. send = re.sub('&lt;a href="\/w\/(?P<in>[^"]*)"&gt;(?P<out>[^&]*)&lt;\/a&gt;', '<a href="/w/\g<in>">\g<out></a>', send)
  132. else:
  133. send = '<br>'
  134. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">r' + rows[i]['id'] + '</a> <a href="/w/' + parse.quote(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(w)</a> <a href="/w/' + parse.quote(rows[i]['title']) + '/raw/' + rows[i]['id'] + '">(raw)</a> <a href="/revert/' + parse.quote(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(되돌리기)</a> (' + rows[i]['leng'] + ')</td><td style="text-align: center;width:33.33%;">' + rows[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  135. i = i + 1
  136. return render_template('index.html', logo = data['name'], rows = div, tn = 5, title = name, page = parse.quote(name))
  137. else:
  138. return render_template('index.html', logo = data['name'], rows = '', tn = 5, title = name, page = parse.quote(name))
  139. @app.route('/search', methods=['POST', 'GET'])
  140. def search():
  141. if(request.method == 'POST'):
  142. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["search"]) + '" />'
  143. else:
  144. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  145. @app.route('/w/<name>')
  146. def w(name = None):
  147. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  148. rows = curs.fetchall()
  149. if(rows):
  150. enddata = namumark(rows[0]['data'])
  151. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 1)
  152. else:
  153. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>문서 없음', license = data['license'], tn = 1)
  154. @app.route('/w/<name>/r/<number>')
  155. def rew(name = None, number = None):
  156. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  157. rows = curs.fetchall()
  158. if(rows):
  159. enddata = namumark(rows[0]['data'])
  160. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 6)
  161. else:
  162. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>문서 없음', license = data['license'], tn = 6)
  163. @app.route('/w/<name>/raw/<number>')
  164. def reraw(name = None, number = None):
  165. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  166. rows = curs.fetchall()
  167. if(rows):
  168. enddata = re.sub("\n", '<br>', rows[0]['data'])
  169. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'])
  170. else:
  171. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>문서 없음', license = data['license'])
  172. @app.route('/raw/<name>')
  173. def raw(name = None):
  174. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  175. rows = curs.fetchall()
  176. if(rows):
  177. enddata = re.sub("\n", '<br>', rows[0]['data'])
  178. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 7)
  179. else:
  180. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '문서 없음', license = data['license'], tn = 7)
  181. @app.route('/revert/<name>/r/<number>', methods=['POST', 'GET'])
  182. def revert(name = None, number = None):
  183. if(request.method == 'POST'):
  184. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  185. rows = curs.fetchall()
  186. if(rows):
  187. ip = getip(request)
  188. today = getnow()
  189. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  190. row = curs.fetchall()
  191. if(row):
  192. leng = getleng(len(row[0]['data']), len(rows[0]['data']))
  193. curs.execute("update data set data = '" + pymysql.escape_string(rows[0]['data']) + "' where title = '" + pymysql.escape_string(name) + "'")
  194. conn.commit()
  195. else:
  196. leng = '+' + str(len(rows[0]['data']))
  197. curs.execute("insert into data (title, data, acl) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(rows[0]['data']) + "', '')")
  198. conn.commit()
  199. recent(name, ip, today, '문서를 ' + number + '판으로 되돌렸습니다.', leng)
  200. history(name, rows[0]['data'], today, ip, '문서를 ' + number + '판으로 되돌렸습니다.', leng)
  201. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  202. else:
  203. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  204. else:
  205. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  206. rows = curs.fetchall()
  207. if(rows):
  208. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), r = parse.quote(number), tn = 13, plus = '정말 되돌리시겠습니까?')
  209. else:
  210. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  211. @app.route('/edit/<name>', methods=['POST', 'GET'])
  212. def edit(name = None):
  213. if(request.method == 'POST'):
  214. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  215. rows = curs.fetchall()
  216. if(rows):
  217. ip = getip(request)
  218. today = getnow()
  219. leng = getleng(len(rows[0]['data']), len(request.form["content"]))
  220. recent(name, ip, today, request.form["send"], leng)
  221. history(name, request.form["content"], today, ip, request.form["send"], leng)
  222. curs.execute("update data set data = '" + pymysql.escape_string(request.form["content"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  223. conn.commit()
  224. else:
  225. ip = getip(request)
  226. today = getnow()
  227. leng = '+' + str(len(request.form["content"]))
  228. recent(name, ip, today, request.form["send"], leng)
  229. history(name, request.form["content"], today, ip, request.form["send"], leng)
  230. curs.execute("insert into data (title, data, acl) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(request.form["content"]) + "', '')")
  231. conn.commit()
  232. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  233. else:
  234. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  235. rows = curs.fetchall()
  236. if(rows):
  237. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = rows[0]['data'], tn = 2)
  238. else:
  239. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '', tn = 2)
  240. @app.route('/delete/<name>', methods=['POST', 'GET'])
  241. def delete(name = None):
  242. if(request.method == 'POST'):
  243. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  244. rows = curs.fetchall()
  245. if(rows):
  246. ip = getip(request)
  247. today = getnow()
  248. leng = '-' + str(len(rows[0]['data']))
  249. recent(name, ip, today, '문서를 삭제 했습니다.', leng)
  250. history(name, '', today, ip, '문서를 삭제 했습니다.', leng)
  251. curs.execute("delete from data where title = '" + pymysql.escape_string(name) + "'")
  252. conn.commit()
  253. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  254. else:
  255. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  256. else:
  257. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  258. rows = curs.fetchall()
  259. if(rows):
  260. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), tn = 8, plus = '정말 삭제 하시겠습니까?')
  261. else:
  262. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  263. @app.route('/move/<name>', methods=['POST', 'GET'])
  264. def move(name = None):
  265. if(request.method == 'POST'):
  266. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  267. rows = curs.fetchall()
  268. if(rows):
  269. ip = getip(request)
  270. today = getnow()
  271. leng = '0'
  272. curs.execute("select * from history where title = '" + pymysql.escape_string(request.form["title"]) + "'")
  273. row = curs.fetchall()
  274. if(row):
  275. return render_template('index.html', title = '이동 오류', logo = data['name'], data = '이동 하려는 곳에 문서가 이미 있습니다.')
  276. else:
  277. recent(name, ip, today, '문서를 <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> 문서로 이동 했습니다.', leng)
  278. history(name, rows[0]['data'], today, ip, '<a href="/w/' + pymysql.escape_string(parse.quote(name)) + '">' + pymysql.escape_string(name) + '</a> 문서를 <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> 문서로 이동 했습니다.', leng)
  279. curs.execute("update data set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  280. curs.execute("update history set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  281. conn.commit()
  282. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["title"]) + '" />'
  283. else:
  284. ip = getip(request)
  285. today = getnow()
  286. leng = '0'
  287. curs.execute("select * from history where title = '" + pymysql.escape_string(request.form["title"]) + "'")
  288. row = curs.fetchall()
  289. if(row):
  290. return render_template('index.html', title = '이동 오류', logo = data['name'], data = '이동 하려는 곳에 문서가 이미 있습니다.')
  291. else:
  292. recent(name, ip, today, '문서를 <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> 문서로 이동 했습니다.', leng)
  293. history(name, rows[0]['data'], today, ip, '<a href="/w/' + pymysql.escape_string(parse.quote(name)) + '">' + pymysql.escape_string(name) + '</a> 문서를 <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> 문서로 이동 했습니다.', leng)
  294. curs.execute("update history set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  295. conn.commit()
  296. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["title"]) + '" />'
  297. else:
  298. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), tn = 9, plus = '정말 이동 하시겠습니까?')
  299. @app.route('/setup')
  300. def setup():
  301. curs.execute("create table if not exists data(title text not null, data longtext not null, acl text not null)")
  302. curs.execute("create table if not exists history(id text not null, title text not null, data longtext not null, date text not null, ip text not null, send text not null, leng text not null)")
  303. curs.execute("create table if not exists rc(title text not null, date text not null, ip text not null, send text not null, leng text not null, back text not null)")
  304. curs.execute("create table if not exists rd(title text not null, sub text not null, date text not null, ip text not null)")
  305. curs.execute("create table if not exists user(id text not null, pw text not null, acl text not null)")
  306. curs.execute("create table if not exists ban(block text not null, end text not null, why text not null, band text not null)")
  307. curs.execute("create table if not exists topic(id text not null, title text not null, sub text not null, data longtext not null, date text not null, ip text not null, block text not null)")
  308. return render_template('index.html', title = '설치 완료', logo = data['name'], data = '문제 없었음')
  309. @app.route('/other')
  310. def other():
  311. return render_template('index.html', title = '기타 메뉴', logo = data['name'], data = '<li><a href="/titleindex">모든 문서</a><li><a href="/grammar">문법 설명</a></li><li><a href="/version">버전</a></li>')
  312. @app.route('/titleindex')
  313. def titleindex():
  314. i = 0
  315. div = '<div>'
  316. curs.execute("select * from data")
  317. rows = curs.fetchall()
  318. if(rows):
  319. while True:
  320. try:
  321. a = rows[i]
  322. except:
  323. div = div + '</div>'
  324. break
  325. div = div + '<li><a href="/w/' + parse.quote(rows[i]['title']) + '">' + rows[i]['title'] + '</a></li>'
  326. i = i + 1
  327. return render_template('index.html', logo = data['name'], rows = div, tn = 4, title = '모든 문서')
  328. else:
  329. return render_template('index.html', logo = data['name'], rows = '', tn = 4, title = '모든 문서')
  330. @app.route('/topic/<name>', methods=['POST', 'GET'])
  331. def topic(name = None):
  332. if(request.method == 'POST'):
  333. return '<meta http-equiv="refresh" content="0;url=/topic/' + parse.quote(name) + '/sub/' + parse.quote(request.form["topic"]) + '" />'
  334. else:
  335. div = '<div>'
  336. i = 0
  337. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "'")
  338. rows = curs.fetchall()
  339. while True:
  340. try:
  341. a = rows[i]
  342. except:
  343. div = div + '</div>'
  344. break
  345. if(i == 0):
  346. sub = rows[i]['sub']
  347. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  348. else:
  349. if(not sub == rows[i]['sub']):
  350. sub = rows[i]['sub']
  351. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  352. i = i + 1
  353. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], plus = div, tn = 10)
  354. @app.route('/topic/<name>/sub/<sub>', methods=['POST', 'GET'])
  355. def sub(name = None, sub = None):
  356. if(request.method == 'POST'):
  357. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 desc limit 1")
  358. rows = curs.fetchall()
  359. if(rows):
  360. number = int(rows[0]['id']) + 1
  361. else:
  362. number = 1
  363. ip = getip(request)
  364. today = getnow()
  365. discuss(name, sub, ip, today)
  366. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + str(number) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', '" + pymysql.escape_string(request.form["content"]) + "', '" + today + "', '" + ip + "', '')")
  367. conn.commit()
  368. return '<meta http-equiv="refresh" content="0;url=/topic/' + parse.quote(name) + '/sub/' + parse.quote(sub) + '" />'
  369. else:
  370. div = '<div>'
  371. i = 0
  372. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 asc")
  373. rows = curs.fetchall()
  374. while True:
  375. try:
  376. a = rows[i]
  377. except:
  378. div = div + '</div>'
  379. break
  380. if(i == 0):
  381. start = rows[i]['ip']
  382. if(rows[i]['ip'] == start):
  383. j = i + 1
  384. div = div + '<table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + rows[i]['ip'] + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td>' + rows[i]['data'] + '</td></tr></tbody></table><br>'
  385. else:
  386. j = i + 1
  387. div = div + '<table id="toron"><tbody><tr><td id="toroncolor"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + rows[i]['ip'] + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td>' + rows[i]['data'] + '</td></tr></tbody></table><br>'
  388. i = i + 1
  389. return render_template('index.html', title = name, page = parse.quote(name), suburl = parse.quote(sub), sub = sub, logo = data['name'], rows = div, tn = 11)
  390. @app.route('/grammar')
  391. def grammar():
  392. return render_template('index.html', title = '문법 설명', logo = data['name'], data = '아직 없음')
  393. @app.route('/version')
  394. def version():
  395. return render_template('index.html', title = '버전', logo = data['name'], tn = 14)
  396. @app.route('/user')
  397. def user():
  398. ip = getip(request)
  399. return render_template('index.html', title = '유저 메뉴', logo = data['name'], data = ip + '<br><br><li><a href="/login">로그인</a></li><li><a href="/logout">로그아웃</a></li>')
  400. @app.route('/random')
  401. def random():
  402. curs.execute("select * from data order by rand() limit 1")
  403. rows = curs.fetchall()
  404. if(rows):
  405. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(rows[0]['title']) + '" />'
  406. else:
  407. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  408. if __name__ == '__main__':
  409. app.run(host = '0.0.0.0', port = 3000)