bbs_w_post.py 17 KB

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