bbs_w_post.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. from .tool.func import *
  2. from .api_bbs_w_post import api_bbs_w_post
  3. from .api_bbs_w_comment import api_bbs_w_comment
  4. def bbs_w_post_make_thread(user_id : str, date : str, data : str, code : str, color : str = '', blind : str = '', add_style : str = '') -> str:
  5. if blind != '':
  6. if data == '':
  7. color_b = 'opennamu_comment_blind'
  8. else:
  9. color_b = 'opennamu_comment_blind_admin'
  10. else:
  11. color_b = 'opennamu_comment_blind_not'
  12. return '''
  13. <table class="opennamu_comment" style="''' + add_style + '''">
  14. <tr>
  15. <td class="opennamu_comment_color_''' + color + '''">
  16. <a href="#thread_shortcut" id="''' + code + '''">#''' + code + '''</a>
  17. ''' + user_id + '''
  18. <span style="float: right;">''' + date + '''</span>
  19. </td>
  20. </tr>
  21. <tr>
  22. <td class="''' + color_b + '''" id="opennamu_comment_data_main">
  23. ''' + data + '''
  24. </td>
  25. </tr>
  26. </table>
  27. '''
  28. def bbs_w_post_comment(user_id : str, sub_code : str, comment_num : str) -> tuple[str, str, int, int]:
  29. comment_data : str = ''
  30. comment_select : str = ''
  31. comment_count : int = 0
  32. comment_add_count : int = 0
  33. thread_data : list[dict[str, str]] = json.loads(api_bbs_w_comment(sub_code).data)
  34. comment_count += len(thread_data)
  35. comment_add_count += comment_count
  36. temp_dict : dict[str, str]
  37. for temp_dict in thread_data:
  38. color : str = 'default'
  39. if user_id == temp_dict['comment_user_id']:
  40. color = 'green'
  41. sub_code_check : str = re.sub(r'^[0-9]+-[0-9]+-', '', sub_code + '-' + temp_dict['code'])
  42. margin_count : int = sub_code_check.count('-')
  43. comment_data += '<span style="padding-left: 20px;"></span>' * margin_count
  44. comment_data += bbs_w_post_make_thread(
  45. ip_pas(temp_dict['comment_user_id']),
  46. temp_dict['comment_date'],
  47. render_set(
  48. doc_name = '',
  49. doc_data = temp_dict['comment'],
  50. data_in = 'from'
  51. ),
  52. sub_code_check,
  53. color = color,
  54. add_style = 'width: calc(100% - ' + str(margin_count * 20) + 'px);'
  55. )
  56. comment_default : str = ''
  57. if comment_num == sub_code_check:
  58. comment_default = 'selected'
  59. comment_select += '<option value="' + sub_code_check + '" ' + comment_default + '>' + sub_code_check + '</option>'
  60. comment_data += '<hr class="main_hr">'
  61. temp_data : tuple[str, str, int, int] = bbs_w_post_comment(user_id, sub_code + '-' + temp_dict['code'], comment_num)
  62. comment_data += temp_data[0]
  63. comment_select += temp_data[1]
  64. comment_add_count += temp_data[3]
  65. return (comment_data, comment_select, comment_count, comment_add_count)
  66. def bbs_w_post(bbs_num : typing.Union[int, str] = '', post_num : typing.Union[int, str] = '', do_type : str = '') -> flask.Response:
  67. conn : typing.Union[sqlite3.Connection, pymysql.connections.Connection]
  68. with get_db_connect() as conn:
  69. curs : typing.Union[sqlite3.Cursor, pymysql.cursors.Cursor] = conn.cursor()
  70. curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
  71. db_data_3 : typing.Optional[list[tuple[str]]] = curs.fetchall()
  72. if not db_data_3:
  73. return redirect('/bbs/main')
  74. bbs_name : str = db_data_3[0][0]
  75. curs.execute(db_change('select set_name, set_data, set_code from bbs_data where set_id = ? and set_code = ?'), [bbs_num, post_num])
  76. db_data : typing.Optional[list[tuple[str, str, str]]] = curs.fetchall()
  77. if not db_data:
  78. return redirect('/bbs/main')
  79. bbs_num_str : str = str(bbs_num)
  80. post_num_str : str = str(post_num)
  81. bbs_comment_acl : int = acl_check(bbs_num_str, 'bbs_comment')
  82. ip : str = ip_check()
  83. set_id : str
  84. text : str
  85. data_preview : str
  86. user_id : str
  87. bbs_comment_form : str
  88. id_data : str
  89. data : str
  90. date : str
  91. temp_dict : dict[str, str]
  92. curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_type"'), [bbs_num])
  93. db_data_2 : typing.Optional[list[tuple[str]]] = curs.fetchall()
  94. if not db_data_2:
  95. return redirect('/bbs/main')
  96. elif db_data_2[0][0] == 'thread':
  97. if flask.request.method == 'POST' and do_type != 'preview':
  98. if bbs_comment_acl == 1:
  99. return redirect('/bbs/set/' + bbs_num_str)
  100. if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
  101. return re_error('/error/13')
  102. else:
  103. captcha_post('', 0)
  104. set_id = bbs_num_str + '-' + post_num_str
  105. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
  106. db_data_4 : typing.Optional[list[tuple[str]]] = curs.fetchall()
  107. id_data = str(int(db_data_4[0][0]) + 1) if db_data_4 else '1'
  108. data = flask.request.form.get('content', '')
  109. if data == '':
  110. # re_error로 대체 예정
  111. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  112. date = get_time()
  113. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
  114. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
  115. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
  116. conn.commit()
  117. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#' + str(int(id_data) + 1))
  118. else:
  119. if acl_check(bbs_num_str, 'bbs_view') == 1:
  120. return re_error('/ban')
  121. text = ''
  122. data_preview = ''
  123. if do_type == 'preview':
  124. text = flask.request.form.get('content', '')
  125. text = text.replace('\r', '')
  126. data_preview = render_set(
  127. doc_name = '',
  128. doc_data = text,
  129. data_in = 'from'
  130. )
  131. temp_dict = json.loads(api_bbs_w_post(bbs_num_str + '-' + post_num_str).data)
  132. data = ''
  133. data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
  134. data += bbs_w_post_make_thread(
  135. ip_pas(temp_dict['user_id']),
  136. temp_dict['date'],
  137. render_set(
  138. doc_name = '',
  139. doc_data = temp_dict['data'],
  140. data_in = 'from'
  141. ),
  142. '1',
  143. color = 'green'
  144. )
  145. data += '<hr class="main_hr">'
  146. user_id = temp_dict['user_id']
  147. count : int = 1
  148. thread_data : list[dict[str, str]] = json.loads(api_bbs_w_comment(bbs_num_str + '-' + post_num_str).data)
  149. for temp_dict in thread_data:
  150. count += 1
  151. if user_id == temp_dict['comment_user_id']:
  152. color = 'green'
  153. else:
  154. color = 'default'
  155. data += bbs_w_post_make_thread(
  156. ip_pas(temp_dict['comment_user_id']),
  157. temp_dict['comment_date'],
  158. render_set(
  159. doc_name = '',
  160. doc_data = temp_dict['comment'],
  161. data_in = 'from'
  162. ),
  163. str(count),
  164. color = color
  165. )
  166. data += '<hr class="main_hr">'
  167. bbs_comment_form = ''
  168. if bbs_comment_acl == 0:
  169. bbs_comment_form += '''
  170. <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
  171. <hr class="main_hr">
  172. ''' + captcha_get() + ip_warning() + '''
  173. <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
  174. <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
  175. <hr class="main_hr">
  176. '''
  177. data += '''
  178. <form method="post">
  179. ''' + bbs_comment_form + '''
  180. ''' + data_preview + '''
  181. </form>
  182. '''
  183. return easy_minify(flask.render_template(skin_check(),
  184. imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
  185. data = data,
  186. menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
  187. ))
  188. else:
  189. # db_data_2[0][0] == 'comment'
  190. if flask.request.method == 'POST' and do_type != 'preview':
  191. if bbs_comment_acl == 1:
  192. return redirect('/bbs/set/' + bbs_num_str)
  193. if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
  194. return re_error('/error/13')
  195. else:
  196. captcha_post('', 0)
  197. select : str = flask.request.form.get('comment_select', 'default')
  198. select = '' if select == 'default' else select
  199. if select != '':
  200. select_split : list[str] = select.split('-')
  201. if len(select_split) < 2:
  202. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str, select_split[0]])
  203. if not curs.fetchall():
  204. # re_error로 변경 예정
  205. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  206. else:
  207. set_id = bbs_num_str + '-' + post_num_str + '-' + select_split[0]
  208. else:
  209. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str + '-' + '-'.join(select_split[0:len(select) - 1]), select_split[len(select_split) - 1]])
  210. if not curs.fetchall():
  211. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  212. else:
  213. set_id = bbs_num_str + '-' + post_num_str + '-' + '-'.join(select_split)
  214. else:
  215. set_id = bbs_num_str + '-' + post_num_str
  216. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
  217. db_data_5 : typing.Optional[list[tuple[str]]] = curs.fetchall()
  218. id_data = str(int(db_data_5[0][0]) + 1) if db_data_5 else '1'
  219. data = flask.request.form.get('content', '')
  220. if data == '':
  221. # re_error로 대체 예정
  222. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  223. date = get_time()
  224. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
  225. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
  226. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
  227. conn.commit()
  228. if set_id == '':
  229. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#' + id_data)
  230. else:
  231. set_id = re.sub(r'^[0-9]+-[0-9]+-?', '', set_id)
  232. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#' + set_id + '-' + id_data)
  233. else:
  234. if acl_check(bbs_num_str, 'bbs_view') == 1:
  235. return re_error('/ban')
  236. text = ''
  237. comment_num : str = ''
  238. data_preview = ''
  239. if do_type == 'preview':
  240. text = flask.request.form.get('content', '')
  241. text = text.replace('\r', '')
  242. comment_num = flask.request.form.get('comment_select', '')
  243. data_preview = render_set(
  244. doc_name = '',
  245. doc_data = text,
  246. data_in = 'from'
  247. )
  248. temp_dict = json.loads(api_bbs_w_post(bbs_num_str + '-' + post_num_str).data)
  249. data = ''
  250. data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
  251. data += bbs_w_post_make_thread(
  252. ip_pas(temp_dict['user_id']),
  253. temp_dict['date'],
  254. render_set(
  255. doc_name = '',
  256. doc_data = temp_dict['data'],
  257. data_in = 'from'
  258. ),
  259. '0',
  260. color = 'red'
  261. )
  262. user_id = temp_dict['user_id']
  263. comment_data : str = ''
  264. comment_select : str = '<hr class="main_hr"><select name="comment_select">'
  265. comment_select += '<option value="default">' + load_lang('normal') + '</option>'
  266. comment_count : int = 0
  267. comment_add_count : int = 0
  268. temp_data : tuple[str, str, int, int] = bbs_w_post_comment(user_id, bbs_num_str + '-' + post_num_str, comment_num)
  269. comment_data += temp_data[0]
  270. comment_select += temp_data[1]
  271. comment_count += temp_data[2]
  272. comment_add_count += temp_data[3]
  273. comment_add_count -= comment_count
  274. if comment_data != '':
  275. data += '<hr class="main_hr"><hr>'
  276. comment_select += '</select>'
  277. if comment_data != '':
  278. data += load_lang('comment') + ' : ' + str(comment_count) + '<hr class="main_hr">'
  279. data += load_lang('reply') + ' : ' + str(comment_add_count) + '<hr class="main_hr">'
  280. data += comment_data
  281. bbs_comment_form = ''
  282. if bbs_comment_acl == 0:
  283. bbs_comment_form += '''
  284. ''' + comment_select + '''
  285. <hr class="main_hr">
  286. <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
  287. <hr class="main_hr">
  288. ''' + captcha_get() + ip_warning() + '''
  289. <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
  290. <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
  291. <hr class="main_hr">
  292. '''
  293. data += '''
  294. <form method="post">
  295. ''' + bbs_comment_form + '''
  296. ''' + data_preview + '''
  297. </form>
  298. '''
  299. return easy_minify(flask.render_template(skin_check(),
  300. imp = [bbs_name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('bbs') + ')', 0])],
  301. data = data,
  302. menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
  303. ))