Browse Source

차단 기록 API로 변경

https://github.com/openNAMU/openNAMU/issues/2164
잉여개발기 (SPDV) 2 years ago
parent
commit
6a7f0f60d6

+ 15 - 10
app.py

@@ -461,16 +461,19 @@ app.route('/auth/give/fix/<user_name>', methods = ['POST', 'GET'])(give_user_fix
 app.route('/app_submit', methods = ['POST', 'GET'])(recent_app_submit_2)
 
 # /auth/history
-app.route('/block_log')(recent_block)
-app.route('/block_log/<int:num>')(recent_block)
-app.route('/block_log/user/<name>', defaults = { 'tool' : 'user' })(recent_block)
-app.route('/block_log/user/<name>/<int:num>', defaults = { 'tool' : 'user' })(recent_block)
-app.route('/block_log/admin/<name>', defaults = { 'tool' : 'admin' })(recent_block)
-app.route('/block_log/admin/<name>/<int:num>', defaults = { 'tool' : 'admin' })(recent_block)
-app.route('/block_log/regex', defaults = { 'tool' : 'regex' })(recent_block)
-app.route('/block_log/regex/<int:num>', defaults = { 'tool' : 'regex' })(recent_block)
-app.route('/block_log/ongoing', defaults = { 'tool' : 'ongoing' })(recent_block)
-app.route('/block_log/ongoing/<int:num>', defaults = { 'tool' : 'ongoing' })(recent_block)
+app.route('/recent_block')(list_recent_block)
+app.route('/recent_block/all')(list_recent_block)
+app.route('/recent_block/all/<int:num>')(list_recent_block)
+app.route('/recent_block/user/<user_name>', defaults = { 'tool' : 'user' })(list_recent_block)
+app.route('/recent_block/user/<user_name>/<int:num>', defaults = { 'tool' : 'user' })(list_recent_block)
+app.route('/recent_block/admin/<user_name>', defaults = { 'tool' : 'admin' })(list_recent_block)
+app.route('/recent_block/admin/<user_name>/<int:num>', defaults = { 'tool' : 'admin' })(list_recent_block)
+app.route('/recent_block/regex', defaults = { 'tool' : 'regex' })(list_recent_block)
+app.route('/recent_block/regex/<int:num>', defaults = { 'tool' : 'regex' })(list_recent_block)
+app.route('/recent_block/cidr', defaults = { 'tool' : 'cidr' })(list_recent_block)
+app.route('/recent_block/cidr/<int:num>', defaults = { 'tool' : 'cidr' })(list_recent_block)
+app.route('/recent_block/ongoing', defaults = { 'tool' : 'ongoing' })(list_recent_block)
+app.route('/recent_block/ongoing/<int:num>', defaults = { 'tool' : 'ongoing' })(list_recent_block)
 
 app.route('/recent_change')(list_recent_change)
 app.route('/recent_changes')(list_recent_change)
@@ -724,6 +727,8 @@ app.route('/api/image/<everything:name>')(api_image_view)
 app.route('/api/v2/recent_edit_request/<set_type>/<int:num>', defaults = { 'db_set' : db_set_str, 'limit' : 50 })(api_list_recent_edit_request)
 app.route('/api/v2/recent_change/<set_type>/<int:num>', defaults = { 'db_set' : db_set_str, 'legacy' : '', 'limit' : 50 })(api_list_recent_change)
 app.route('/api/v2/recent_discuss/<set_type>/<int:num>', defaults = { 'db_set' : db_set_str, 'legacy' : '', 'limit' : 50 })(api_list_recent_discuss)
+app.route('/api/v2/recent_block/<set_type>/<int:num>', defaults = { 'db_set' : db_set_str })(api_list_recent_block)
+app.route('/api/v2/recent_block/<set_type>/<int:num>/<user_name>', defaults = { 'db_set' : db_set_str })(api_list_recent_block)
 app.route('/api/v2/list/document/old/<int:num>', defaults = { 'db_set' : db_set_str, 'set_type' : 'old' })(api_list_old_page)
 app.route('/api/v2/list/document/new/<int:num>', defaults = { 'db_set' : db_set_str, 'set_type' : 'new' })(api_list_old_page)
 

+ 2 - 1
route/__init__.py

@@ -100,7 +100,6 @@ from route.main_view_image import main_view_image
 
 from route.recent_app_submit import recent_app_submit_2
 
-from route.recent_block import recent_block
 from route.recent_change import recent_change
 from route.recent_edit_request import recent_edit_request
 from route.recent_history_add import recent_history_add
@@ -164,6 +163,7 @@ from route.vote_select import vote_select
 
 from route.n_list_recent_change import list_recent_change
 from route.n_list_recent_discuss import list_recent_discuss
+from route.n_list_recent_block import list_recent_block
 from route.n_list_old_page import list_old_page
 
 from route.n_bbs_in import bbs_in
@@ -184,6 +184,7 @@ from route.go_api_search import api_search
 
 from route.go_api_list_recent_change import api_list_recent_change
 from route.go_api_list_recent_discuss import api_list_recent_discuss
+from route.go_api_list_recent_block import api_list_recent_block
 from route.go_api_list_recent_edit_request import api_list_recent_edit_request
 from route.go_api_list_old_page import api_list_old_page
 

+ 2 - 1
route/api_user_info.py

@@ -117,7 +117,8 @@ def api_user_info(user_name = ''):
             'ban',
             'level',
             'option',
-            'edit_request_able'
+            'edit_request_able',
+            'cidr'
         ]
         lang_data = { for_a : get_lang(conn, for_a) for for_a in lang_data_list }
                 

+ 6 - 5
route/give_user_ban.py

@@ -81,7 +81,7 @@ def give_user_ban(name = None, ban_type = ''):
                     1 if release != '' else 0
                 )
 
-            return redirect(conn, '/block_log')
+            return redirect(conn, '/recent_block')
         else:
             if ban_type == 'multiple':
                 main_name = get_lang(conn, 'multiple_ban')
@@ -105,10 +105,11 @@ def give_user_ban(name = None, ban_type = ''):
                 if db_data and db_data[0][0] != '':
                     date_value = db_data[0][0].split()[0]
 
-                info_data = '''
-                    <div id="opennamu_get_user_info">''' + html.escape(name) + '''</div>
-                    <hr class="main_hr">
-                '''
+                if ban_type == '':
+                    info_data = '''
+                        <div id="opennamu_get_user_info">''' + html.escape(name) + '''</div>
+                        <hr class="main_hr">
+                    '''
 
             return easy_minify(conn, flask.render_template(skin_check(conn),
                 imp = [main_name, wiki_set(conn), wiki_custom(conn), wiki_css([now, 0])],

+ 24 - 0
route/go_api_list_recent_block.py

@@ -0,0 +1,24 @@
+from .tool.func import *
+
+def api_list_recent_block(db_set, num = 1, set_type = 'all', user_name = 'Test'):
+    other_set = {}
+    other_set["num"] = str(num)
+    other_set["set_type"] = set_type
+    other_set["user_name"] = user_name
+    other_set["ip"] = ip_check()
+    other_set = json.dumps(other_set)
+
+    if platform.system() == 'Linux':
+        if platform.machine() in ["AMD64", "x86_64"]:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.bin"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+        else:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.bin"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+    else:
+        if platform.machine() in ["AMD64", "x86_64"]:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.exe"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+        else:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.exe"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+
+    data = data.decode('utf8')
+
+    return flask.Response(response = data, status = 200, mimetype = 'application/json')

+ 1 - 1
route/main_tool_other.py

@@ -33,7 +33,7 @@ def main_tool_other():
                 </ul>
                 <h3>''' + get_lang(conn, 'user') + '''</h3>
                 <ul class="opennamu_ul">
-                    <li><a href="/block_log">''' + get_lang(conn, 'recent_ban') + '''</a></li>
+                    <li><a href="/recent_block">''' + get_lang(conn, 'recent_ban') + '''</a></li>
                     <li><a href="/list/user">''' + get_lang(conn, 'member_list') + '''</a></li>
                 </ul>
                 <h3>''' + get_lang(conn, 'other') + '''</h3>

+ 2 - 2
route/main_tool_redirect.py

@@ -13,8 +13,8 @@ def main_tool_redirect(num = 1, add_2 = ''):
             6 : [get_lang(conn, 'name'), '/auth/list/add', get_lang(conn, 'add_admin_group')],
             7 : [get_lang(conn, 'name'), '/filter/edit_filter/add', get_lang(conn, 'edit_filter_add')],
             8 : [get_lang(conn, 'document_name'), '/search', get_lang(conn, 'search')],
-            9 : [0, '/block_log/user', get_lang(conn, 'blocked_user')],
-            10 : [0, '/block_log/admin', get_lang(conn, 'blocked_admin')],
+            9 : [0, '/recent_block/user', get_lang(conn, 'blocked_user')],
+            10 : [0, '/recent_block/admin', get_lang(conn, 'blocked_admin')],
             11 : [get_lang(conn, 'document_name'), '/watch_list', get_lang(conn, 'add_watchlist')],
             12 : [get_lang(conn, 'compare_target'), '/list/user/check', get_lang(conn, 'compare_target')],
             13 : [get_lang(conn, 'document_name'), '/edit', get_lang(conn, 'load')],

+ 25 - 0
route/n_list_recent_block.py

@@ -0,0 +1,25 @@
+from .tool.func import *
+
+def list_recent_block(user_name = 'Test', tool = 'all', num = 1):
+    with get_db_connect() as conn:
+        sub = 0
+        if tool == 'ongoing':
+            sub = '(' + get_lang(conn, 'in_progress') + ')'
+        elif tool == 'regex':
+            sub = '(' + get_lang(conn, 'regex') + ')'
+        elif tool == 'user':
+            sub = '(' + get_lang(conn, 'blocked') + ')'
+        elif tool == 'cidr':
+            sub = '(' + get_lang(conn, 'cidr') + ')'
+        else:
+            sub = '(' + get_lang(conn, 'admin') + ')'
+
+        return easy_minify(conn, flask.render_template(skin_check(conn),
+            imp = [get_lang(conn, 'recent_ban'), wiki_set(conn), wiki_custom(conn), wiki_css([sub, 0])],
+            data = '' + \
+                '<div id="opennamu_list_recent_block"></div>' + \
+                '<script defer src="/views/main_css/js/route/list_recent_block.js' + cache_v() + '"></script>' + \
+                '<script>window.addEventListener("DOMContentLoaded", function() { opennamu_list_recent_block(); });</script>' + \
+            '',
+            menu = [['other', get_lang(conn, 'return')]]
+        ))

+ 0 - 49
route/recent_block.py

@@ -4,55 +4,6 @@ def recent_block(name = 'Test', tool = 'all', num = 1):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        sql_num = (num * 50 - 50) if num * 50 > 0 else 0
-
-        div = '''
-            <table id="main_table_set">
-                <tbody>
-                    <tr id="main_table_top_tr">
-                        <td id="main_table_width">''' + get_lang(conn, 'blocked') + '''</td>
-                        <td id="main_table_width">''' + get_lang(conn, 'admin') + '''</td>
-                        <td id="main_table_width">''' + get_lang(conn, 'period') + '''</td>
-                    </tr>
-        '''
-
-        div = '' + \
-            '<a href="/block_log">(' + get_lang(conn, 'all') + ')</a> ' + \
-            '<a href="/manager/11">(' + get_lang(conn, 'blocked') + ')</a> ' + \
-            '<a href="/manager/12">(' + get_lang(conn, 'admin') + ')</a> ' + \
-            '<a href="/block_log/ongoing">(' + get_lang(conn, 'in_progress') + ')</a> ' + \
-            '<a href="/block_log/regex">(' + get_lang(conn, 'regex') + ')</a>' + \
-            '<hr class="main_hr">' + \
-        '' + div
-
-        if tool == 'all':
-            sub = 0
-            menu = [['other', get_lang(conn, 'return')]]
-
-            curs.execute(db_change("select why, block, blocker, end, today, band, ongoing from rb order by today desc limit ?, 50"), [sql_num])
-        elif tool == 'ongoing':
-            sub = '(' + get_lang(conn, 'in_progress') + ')'
-            menu = [['other', get_lang(conn, 'return')]]
-
-            curs.execute(db_change("select why, block, blocker, end, today, band, ongoing from rb where ongoing = '1' order by end desc limit ?, 50"), [sql_num])
-        elif tool == 'regex':
-            sub = '(' + get_lang(conn, 'regex') + ')'
-            menu = [['other', get_lang(conn, 'return')]]
-
-            curs.execute(db_change("select why, block, blocker, end, today, band, ongoing from rb where band = 'regex' order by today desc limit ?, 50"), [sql_num])
-        elif tool == 'user':
-            sub = '(' + get_lang(conn, 'blocked') + ')'
-            menu = [['other', get_lang(conn, 'return')]]
-
-            curs.execute(db_change("select why, block, blocker, end, today, band, ongoing from rb where block = ? order by today desc limit ?, 50"), [name, sql_num])
-        else:
-            sub = '(' + get_lang(conn, 'admin') + ')'
-            menu = [['other', get_lang(conn, 'return')]]
-
-            curs.execute(db_change("select why, block, blocker, end, today, band, ongoing from rb where blocker = ? order by today desc limit ?, 50"), [name, sql_num])
-
-        data_list = curs.fetchall()
-        all_ip = ip_pas(conn, [i[1] for i in data_list] + [i[2] for i in data_list])
         for data in data_list:
             why = '<br>' if data[0] == '' else html.escape(data[0])
             if why == 'edit filter':

+ 6 - 1
route/tool/func.py

@@ -1069,7 +1069,7 @@ def skin_check(conn, set_n = 0):
         return skin
     
 def cache_v():
-    return '.cache_v246'
+    return '.cache_v247'
 
 def wiki_css(data):
     global global_wiki_set
@@ -2193,6 +2193,11 @@ def ip_pas(conn, raw_ip, type_data = 0):
     get_ip = list(set(get_ip))
     
     for raw_ip in get_ip:
+        if re.search(r"^tool:", raw_ip):
+            end_ip[raw_ip] = raw_ip
+
+            continue
+
         change_ip = 0
         is_this_ip = ip_or_user(raw_ip)
         if is_this_ip != 0:

+ 2 - 2
route/user_edit_filter.py

@@ -5,7 +5,7 @@ def user_edit_filter(name = ''):
         curs = conn.cursor()
 
         if admin_check(conn, 1, None) != 1:
-            return redirect(conn, '/block_log')
+            return redirect(conn, '/recent_block')
 
         if flask.request.method == 'POST':
             curs.execute(db_change('delete from user_set where name = "edit_filter" and id = ?'), [name])
@@ -25,5 +25,5 @@ def user_edit_filter(name = ''):
                         <button type="submit">''' + get_lang(conn, 'delete') + '''</button>
                     </form>
                 ''',
-                menu = [['block_log', get_lang(conn, 'return')]]
+                menu = [['recent_block', get_lang(conn, 'return')]]
             ))

BIN
route_go/bin/main.amd64.bin


BIN
route_go/bin/main.amd64.exe


BIN
route_go/bin/main.arm64.bin


BIN
route_go/bin/main.arm64.exe


+ 2 - 0
route_go/main.go

@@ -61,6 +61,8 @@ func main() {
 		route_data = route.Api_bbs_w(call_arg[1:])
 	} else if call_arg[0] == "api_w_set_reset" {
 		route_data = route.Api_w_set_reset(call_arg[1:])
+	} else if call_arg[0] == "api_list_recent_block" {
+		route_data = route.Api_list_recent_block(call_arg[1:])
 	} else {
 		log.Fatal("404")
 	}

+ 188 - 0
route_go/route/api_list_recent_block.go

@@ -0,0 +1,188 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_recent_block(call_arg []string) string {
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &db_set)
+
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[1]), &other_set)
+
+	db := tool.DB_connect(db_set)
+	defer db.Close()
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * 50) - 50
+	} else {
+		page_int = 0
+	}
+
+	var stmt *sql.Stmt
+	var rows *sql.Rows
+	if other_set["set_type"] == "all" {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "ongoing" {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb where ongoing = '1' order by end desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "regex" {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb where band = 'regex' order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "user" {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb where block = ? order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(other_set["user_name"], page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "cidr" {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb where band = 'cidr' order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else {
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select why, block, blocker, end, today, band, ongoing from rb where blocker = ? order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(other_set["user_name"], page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+
+	defer stmt.Close()
+	defer rows.Close()
+
+	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var why string
+		var block string
+		var blocker string
+		var end string
+		var today string
+		var band string
+		var ongoing string
+
+		err := rows.Scan(&why, &block, &blocker, &end, &today, &band, &ongoing)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		var ip_pre_blocker string
+		var ip_render_blocker string
+
+		if _, ok := ip_parser_temp[blocker]; ok {
+			ip_pre_blocker = ip_parser_temp[blocker][0]
+			ip_render_blocker = ip_parser_temp[blocker][1]
+		} else {
+			ip_pre_blocker = tool.IP_preprocess(db, db_set, blocker, other_set["ip"])[0]
+			ip_render_blocker = tool.IP_parser(db, db_set, blocker, other_set["ip"])
+
+			ip_parser_temp[blocker] = []string{ip_pre_blocker, ip_render_blocker}
+		}
+
+		var ip_pre_block string
+		var ip_render_block string
+
+		if band == "" {
+			if _, ok := ip_parser_temp[block]; ok {
+				ip_pre_block = ip_parser_temp[block][0]
+				ip_render_block = ip_parser_temp[block][1]
+			} else {
+				ip_pre_block = tool.IP_preprocess(db, db_set, block, other_set["ip"])[0]
+				ip_render_block = tool.IP_parser(db, db_set, block, other_set["ip"])
+
+				ip_parser_temp[block] = []string{ip_pre_block, ip_render_block}
+			}
+		} else {
+			ip_pre_block = block
+			ip_render_block = block
+		}
+
+		data_list = append(data_list, []string{
+			why,
+			ip_pre_block,
+			ip_render_block,
+			ip_pre_blocker,
+			ip_render_blocker,
+			end,
+			today,
+			band,
+			ongoing,
+		})
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"all":         tool.Get_language(db, db_set, "all", false),
+		"regex":       tool.Get_language(db, db_set, "regex", false),
+		"cidr":        tool.Get_language(db, db_set, "cidr", false),
+		"in_progress": tool.Get_language(db, db_set, "in_progress", false),
+		"admin":       tool.Get_language(db, db_set, "admin", false),
+		"blocked":     tool.Get_language(db, db_set, "blocked", false),
+		"limitless":   tool.Get_language(db, db_set, "limitless", false),
+		"release":     tool.Get_language(db, db_set, "release", false),
+		"start":       tool.Get_language(db, db_set, "start", false),
+		"end":         tool.Get_language(db, db_set, "end", false),
+		"ban":         tool.Get_language(db, db_set, "ban", false),
+	}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	auth_name := tool.Get_user_auth(db, db_set, other_set["ip"])
+	auth_info := tool.Get_auth_group_info(db, db_set, auth_name)
+
+	return_data["auth"] = auth_info
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 6 - 0
route_go/route/tool/ip_parser.go

@@ -5,6 +5,7 @@ import (
 	"log"
 	"regexp"
 	"strconv"
+	"strings"
 )
 
 func IP_or_user(ip string) bool {
@@ -119,6 +120,11 @@ func IP_preprocess(db *sql.DB, db_set map[string]string, ip string, my_ip string
 	var ip_view string
 	var user_name_view string
 
+	ip_split := strings.Split(ip, ":")
+	if len(ip_split) != 1 && ip_split[0] == "tool" {
+		return []string{ip, ""}
+	}
+
 	err := db.QueryRow(DB_change(db_set, "select data from other where name = 'ip_view'")).Scan(&ip_view)
 	if err != nil {
 		if err == sql.ErrNoRows {

+ 7 - 3
route_go/route/tool/language.go

@@ -32,9 +32,13 @@ func Get_language(db *sql.DB, db_set map[string]string, data string, safe bool)
 		return ""
 	}
 
-	if safe {
-		return lang_data[data]
+	if _, ok := lang_data[data]; ok {
+		if safe {
+			return lang_data[data]
+		} else {
+			return HTML_escape(lang_data[data])
+		}
 	} else {
-		return HTML_escape(lang_data[data])
+		return data + " (" + language + ")"
 	}
 }

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.5.0-dev101",
+        "r_ver" : "v3.5.0-dev102",
         "c_ver" : "20240426",
         "s_ver" : "20240426"
     }

+ 4 - 2
views/main_css/js/func/insert_user_info.js

@@ -32,9 +32,11 @@ function do_insert_user_info() {
                 
                 get_data_ban += lang_data['type'] + ' : ';
                 if(data['data']['ban']['type'] === 'normal') {
-                    get_data_ban += '<a href="/block_log/user/' + opennamu_do_url_encode(name) + '">' + lang_data['normal'] + '</a>'; 
+                    get_data_ban += '<a href="/recent_block/user/' + opennamu_do_url_encode(name) + '">' + lang_data['normal'] + '</a>'; 
+                } else if(data['data']['ban']['type'] === 'cidr') {
+                    get_data_ban += '<a href="/recent_block/cidr">' + lang_data['cidr'] + '</a>';
                 } else {
-                    get_data_ban += '<a href="/block_log/regex">' + lang_data['regex'] + '</a>';
+                    get_data_ban += '<a href="/recent_block/regex">' + lang_data['regex'] + '</a>';
                 }
                 get_data_ban += '<br>';
                 

+ 127 - 0
views/main_css/js/route/list_recent_block.js

@@ -0,0 +1,127 @@
+"use strict";
+
+function opennamu_list_recent_block() {
+    const url = window.location.pathname;
+    const url_split = url.split('/');
+
+    let tool = 'all';
+    let page = '1';
+    let user_name = '';
+    if(url_split.length > 2) {
+        tool = url_split[2];
+
+        if(tool === 'user' || tool === 'admin') {
+            if(url_split.length > 3) {
+                user_name = '/' + url_split[3];
+
+                if(url_split.length > 4) {
+                    page = url_split[4];
+                }
+            }
+        } else {
+            if(url_split.length > 3) {
+                page = url_split[3];
+            }
+        }
+    }
+
+    console.log('/api/v2/recent_block/' + tool + '/' + page + user_name);
+    fetch('/api/v2/recent_block/' + tool + '/' + page + user_name).then(function(res) {
+        return res.json();
+    }).then(function(data) {
+        let lang = data["language"];
+        let auth = data["auth"];
+        data = data["data"];
+
+        let data_html = '';
+
+        let option_list = [['all', 'all'], ['regex', 'regex'], ['cidr', 'cidr'], ['ongoing', 'in_progress']];
+        for(let for_a = 0; for_a < option_list.length; for_a++) {
+            data_html += '<a href="/recent_block/' + option_list[for_a][0] + '">(' + lang[option_list[for_a][1]] + ')</a> ';
+        }
+
+        option_list = [['/manager/11', 'blocked'], ['/manager/12', 'admin']];
+        for(let for_a = 0; for_a < option_list.length; for_a++) {
+            data_html += '<a href="' + option_list[for_a][0] + '">(' + lang[option_list[for_a][1]] + ')</a> ';
+        }
+
+        data_html += '<hr class="main_hr">';
+
+        /*
+            data_list = append(data_list, []string{
+                why,
+                ip_pre_block,
+                ip_render_block,
+                ip_pre_blocker,
+                ip_render_blocker,
+                end,
+                today,
+                band,
+                ongoing,
+            })
+        */
+        for(let for_a = 0; for_a < data.length; for_a++) {
+            let left = '';
+
+            let ban_auth = (auth["owner"] === true || auth["ban"] === true);
+            let ip = data[for_a][1];
+            if(data[for_a][7] === '') {
+                if(ban_auth) {
+                    ip = '<a href="/auth/give/ban/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
+                }
+                
+                if(data[for_a][8] === '1') {
+                    ip = '<s>' + ip + '</s>';
+                }
+            } else if(data[for_a][7] === 'cidr') {
+                if(ban_auth) {
+                    ip = '<a href="/auth/give/ban_cidr/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
+                }
+
+                if(data[for_a][8] === '1') {
+                    ip = '<s>' + ip + '</s>';
+                }
+
+                ip += ' (' + lang['cidr'] + ')';
+            } else {
+                if(ban_auth) {
+                    ip = '<a href="/auth/give/ban_regex/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
+                }
+
+                if(data[for_a][8] === '1') {
+                    ip = '<s>' + ip + '</s>';
+                }
+
+                ip += ' (' + lang['regex'] + ')';
+            }
+            
+            left += ip + ' ← ' + data[for_a][4];
+
+            let end = "";
+            if(data[for_a][5] === "release") {
+                end = lang["release"];
+            } else if(data[for_a][5] === "") {
+                end = lang["limitless"];
+            } else {
+                end = data[for_a][5];
+            }
+
+            let right = end + '<br>' + data[for_a][6];
+
+            let bottom = '';
+            if(data[for_a][0] !== "") {
+                if(data[for_a][0] === "edit filter") {
+                    bottom = '<a href="/edit_filter/' + opennamu_do_url_encode(data[for_a][1]) + '">edit filter</a>'
+                } else {
+                    bottom = opennamu_send_render(opennamu_xss_filter(data[for_a][0]));
+                }
+            }
+
+            data_html += openamu_make_list(left, right, bottom);
+        }
+
+        data_html += opennamu_page_control('/recent_block/' + tool + user_name + '/{}', Number(page), data.length);
+
+        document.getElementById('opennamu_list_recent_block').innerHTML = data_html;
+    });
+}