这个计分板插件最开始是战队里一个学长开发的,能用是能用,但很多东西都是写死的,不够优雅,正好在整合CTFd,进行一手二次开发!
学长原始的仓库地址:https://github.com/Ephemeral1y/ctfd-matrix-scoreboard
二次开发的新的仓库地址:https://github.com/IShiraiKurokoI/CTFd-Matrix-Scoreboard
首先就是处理一下数组越界的问题,原来的插件是指定总题目数量的,如果题目增加了就需要手动修改,这样太不优雅了,修改一下:
1 2 3 4 5
| ... num = Challenges.query.filter(*[]).order_by(Challenges.id.asc()).all()[-1].id ... blood = [[] for i in range(num)] ...
|
然后就是解决没有学号的用户导致加分异常的问题:
1 2 3 4 5
| if get_config("matrix:score_switch"): s_user = Users.query.filter_by(id=teamid).first_or_404() if s_user.sid: if str(s_user.sid[:4]) in str(get_config("matrix:score_grade")): score += get_config("matrix:score_num")
|
然后就是动态切换计分板的问题,原来的插件是直接覆盖了主题的计分板模板,这样的话动态切换比较麻烦,修改为:
1 2 3 4 5 6
| dir_path = os.path.dirname(os.path.realpath(__file__)) template_path = os.path.join(dir_path, 'scoreboard-matrix.html') override_template('scoreboard-matrix.html', open(template_path).read())
app.view_functions['scoreboard.listing'] = scoreboard_view app.view_functions['scoreboard.score'] = scores
|
函数scoreboard_view也对应修改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def scoreboard_view(): if scores_visible() and not authed(): return redirect(url_for('auth.login', next=request.path)) if get_config("matrix:switch"): if not scores_visible(): return render_template('scoreboard-matrix.html', errors=['当前分数已隐藏']) standings = get_standings() return render_template('scoreboard-matrix.html', standings=standings, score_frozen=is_scoreboard_frozen(), mode='users' if is_users_mode() else 'teams', challenges=get_challenges(), theme=ctf_theme()) else: freeze = get_config("freeze") infos = get_infos() if freeze: infos.append("计分板已经冻结。") if not scores_visible(): infos.append("当前分数已隐藏。") return render_template("scoreboard.html", standings=CTFd.utils.scores.get_standings(), infos=infos)
|
改了这么多有人就要问了,你这配置写哪了,写在开头了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| from CTFd.plugins import ( register_admin_plugin_menu_bar, override_template, ) from CTFd.utils import get_config, set_config
def setup_default_configs(): current_year = datetime.datetime.now().year year_string = str(current_year) for key, val in { 'setup': 'true', 'switch': False, 'score_switch': False, 'score_grade': year_string, 'score_num': 1200, }.items(): set_config('matrix:' + key, val)
def load(app): plugin_name = __name__.split('.')[-1] set_config('matrix:plugin_name', plugin_name) app.db.create_all() if not get_config("matrix:setup"): setup_default_configs() if not get_config("matrix:score_switch"): set_config("matrix:score_switch", False) if not get_config("matrix:score_grade"): current_year = datetime.datetime.now().year year_string = str(current_year) set_config("matrix:score_grade", year_string) if not get_config("matrix:score_num"): set_config("matrix:score_num", 1200) register_admin_plugin_menu_bar(title='比赛计分板', route='/plugins/matrix/admin/settings')
page_blueprint = Blueprint("matrix", __name__, template_folder="templates", static_folder="static", url_prefix="/plugins/matrix") worker_config_commit = None
@page_blueprint.route('/admin/settings') @admins_only def admin_configs(): nonlocal worker_config_commit if not get_config("matrix:switch") != worker_config_commit: worker_config_commit = get_config("matrix:switch") return render_template('matrix_config.html')
app.register_blueprint(page_blueprint) ...
|
然后页面的前端模板就不赘述了,详情参看repo:https://github.com/IShiraiKurokoI/CTFd-Matrix-Scoreboard
效果如下:
可通过后端更改开关实时变更计分板样式(主题计分板/比赛计分板)
PS:我们Scr1w战队二次开发的CTFd整合版地址:https://github.com/dlut-sss/CTFD-Public