done
This commit is contained in:
parent
552c412c17
commit
bf1881ccb5
13 changed files with 551 additions and 148 deletions
14
README.md
Normal file
14
README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# ???
|
||||||
|
|
||||||
|
# building
|
||||||
|
|
||||||
|
- `task build-backend`
|
||||||
|
- `task build-frontend`
|
||||||
|
|
||||||
|
# dev
|
||||||
|
- `task dev-backend`
|
||||||
|
- `task dev-frontend`
|
||||||
|
- (in separate terminals)
|
||||||
|
|
||||||
|
# deploy
|
||||||
|
- `./gw`
|
30
index.html
30
index.html
|
@ -1,30 +0,0 @@
|
||||||
<script src="/public/standard.js"></script>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div id="lelelelele">
|
|
||||||
<h1>???</h1>
|
|
||||||
Referral: <input id="referral-other" type="text"></input>
|
|
||||||
<button onclick="entry()">Create entry.</button>
|
|
||||||
<br><br>
|
|
||||||
<b>What is this?</b>
|
|
||||||
<p>At exactly 00:00 CET on 1 Jan, the system will choose a random entry. Their referral key shall be publically
|
|
||||||
displayed on this page. The person associated to this referral key shall contact us with their private key.
|
|
||||||
They shall win a little prize. To have one's entry weigh more than the rest, one shall have to spread their
|
|
||||||
referral key amongst the people. Every referral shall increase their chance of getting selected.</p>
|
|
||||||
<b>How does one enter?</b>
|
|
||||||
<p>One needs a referral key to enter.</p>
|
|
||||||
<p id="referral-key"></p>
|
|
||||||
<p id="private-key"></p>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
background-color: black;
|
|
||||||
color: #4af626;
|
|
||||||
text-align: center;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
1
public/assets/index-CHOkfbIW.css
Normal file
1
public/assets/index-CHOkfbIW.css
Normal file
File diff suppressed because one or more lines are too long
1
public/assets/index-Ccw9dgTj.js
Normal file
1
public/assets/index-Ccw9dgTj.js
Normal file
File diff suppressed because one or more lines are too long
15
public/index.html
Normal file
15
public/index.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/public/vite.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta name="color-scheme" content="light dark" />
|
||||||
|
<title>Vite + Preact</title>
|
||||||
|
<script type="module" crossorigin src="/public/assets/index-Ccw9dgTj.js"></script>
|
||||||
|
<link rel="stylesheet" crossorigin href="/public/assets/index-CHOkfbIW.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,16 +0,0 @@
|
||||||
async function entry() {
|
|
||||||
var request = await fetch("/entry", {
|
|
||||||
headers: {
|
|
||||||
referral: document.getElementById("referral-other").value
|
|
||||||
}
|
|
||||||
})
|
|
||||||
var body = await request.json();
|
|
||||||
|
|
||||||
document.getElementById("referral-key").innerText = body.referral;
|
|
||||||
document.getElementById("private-key").innerText = body.key;
|
|
||||||
|
|
||||||
if(body.err) {
|
|
||||||
document.getElementById("lelelelele").innerHTML = `<h1 style="font-weight:bold;color:red">Do not mess with me.</h1>`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
15
public/vite.svg
Normal file
15
public/vite.svg
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%">
|
||||||
|
<stop offset="0%" stop-color="#41D1FF"></stop>
|
||||||
|
<stop offset="100%" stop-color="#BD34FE"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%">
|
||||||
|
<stop offset="0%" stop-color="#FFEA83"></stop>
|
||||||
|
<stop offset="8.333%" stop-color="#FFDD35"></stop>
|
||||||
|
<stop offset="100%" stop-color="#FFA800"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path>
|
||||||
|
<path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
362
sqlite3_64.def
Normal file
362
sqlite3_64.def
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
EXPORTS
|
||||||
|
sqlite3_aggregate_context
|
||||||
|
sqlite3_aggregate_count
|
||||||
|
sqlite3_auto_extension
|
||||||
|
sqlite3_autovacuum_pages
|
||||||
|
sqlite3_backup_finish
|
||||||
|
sqlite3_backup_init
|
||||||
|
sqlite3_backup_pagecount
|
||||||
|
sqlite3_backup_remaining
|
||||||
|
sqlite3_backup_step
|
||||||
|
sqlite3_bind_blob
|
||||||
|
sqlite3_bind_blob64
|
||||||
|
sqlite3_bind_double
|
||||||
|
sqlite3_bind_int
|
||||||
|
sqlite3_bind_int64
|
||||||
|
sqlite3_bind_null
|
||||||
|
sqlite3_bind_parameter_count
|
||||||
|
sqlite3_bind_parameter_index
|
||||||
|
sqlite3_bind_parameter_name
|
||||||
|
sqlite3_bind_pointer
|
||||||
|
sqlite3_bind_text
|
||||||
|
sqlite3_bind_text16
|
||||||
|
sqlite3_bind_text64
|
||||||
|
sqlite3_bind_value
|
||||||
|
sqlite3_bind_zeroblob
|
||||||
|
sqlite3_bind_zeroblob64
|
||||||
|
sqlite3_blob_bytes
|
||||||
|
sqlite3_blob_close
|
||||||
|
sqlite3_blob_open
|
||||||
|
sqlite3_blob_read
|
||||||
|
sqlite3_blob_reopen
|
||||||
|
sqlite3_blob_write
|
||||||
|
sqlite3_busy_handler
|
||||||
|
sqlite3_busy_timeout
|
||||||
|
sqlite3_cancel_auto_extension
|
||||||
|
sqlite3_changes
|
||||||
|
sqlite3_changes64
|
||||||
|
sqlite3_clear_bindings
|
||||||
|
sqlite3_close
|
||||||
|
sqlite3_close_v2
|
||||||
|
sqlite3_collation_needed
|
||||||
|
sqlite3_collation_needed16
|
||||||
|
sqlite3_column_blob
|
||||||
|
sqlite3_column_bytes
|
||||||
|
sqlite3_column_bytes16
|
||||||
|
sqlite3_column_count
|
||||||
|
sqlite3_column_database_name
|
||||||
|
sqlite3_column_database_name16
|
||||||
|
sqlite3_column_decltype
|
||||||
|
sqlite3_column_decltype16
|
||||||
|
sqlite3_column_double
|
||||||
|
sqlite3_column_int
|
||||||
|
sqlite3_column_int64
|
||||||
|
sqlite3_column_name
|
||||||
|
sqlite3_column_name16
|
||||||
|
sqlite3_column_origin_name
|
||||||
|
sqlite3_column_origin_name16
|
||||||
|
sqlite3_column_table_name
|
||||||
|
sqlite3_column_table_name16
|
||||||
|
sqlite3_column_text
|
||||||
|
sqlite3_column_text16
|
||||||
|
sqlite3_column_type
|
||||||
|
sqlite3_column_value
|
||||||
|
sqlite3_commit_hook
|
||||||
|
sqlite3_compileoption_get
|
||||||
|
sqlite3_compileoption_used
|
||||||
|
sqlite3_complete
|
||||||
|
sqlite3_complete16
|
||||||
|
sqlite3_config
|
||||||
|
sqlite3_context_db_handle
|
||||||
|
sqlite3_create_collation
|
||||||
|
sqlite3_create_collation_v2
|
||||||
|
sqlite3_create_collation16
|
||||||
|
sqlite3_create_filename
|
||||||
|
sqlite3_create_function
|
||||||
|
sqlite3_create_function_v2
|
||||||
|
sqlite3_create_function16
|
||||||
|
sqlite3_create_module
|
||||||
|
sqlite3_create_module_v2
|
||||||
|
sqlite3_create_window_function
|
||||||
|
sqlite3_data_count
|
||||||
|
sqlite3_data_directory
|
||||||
|
sqlite3_database_file_object
|
||||||
|
sqlite3_db_cacheflush
|
||||||
|
sqlite3_db_config
|
||||||
|
sqlite3_db_filename
|
||||||
|
sqlite3_db_handle
|
||||||
|
sqlite3_db_mutex
|
||||||
|
sqlite3_db_name
|
||||||
|
sqlite3_db_readonly
|
||||||
|
sqlite3_db_release_memory
|
||||||
|
sqlite3_db_status
|
||||||
|
sqlite3_declare_vtab
|
||||||
|
sqlite3_deserialize
|
||||||
|
sqlite3_drop_modules
|
||||||
|
sqlite3_enable_load_extension
|
||||||
|
sqlite3_enable_shared_cache
|
||||||
|
sqlite3_errcode
|
||||||
|
sqlite3_errmsg
|
||||||
|
sqlite3_errmsg16
|
||||||
|
sqlite3_error_offset
|
||||||
|
sqlite3_errstr
|
||||||
|
sqlite3_exec
|
||||||
|
sqlite3_expanded_sql
|
||||||
|
sqlite3_expired
|
||||||
|
sqlite3_extended_errcode
|
||||||
|
sqlite3_extended_result_codes
|
||||||
|
sqlite3_file_control
|
||||||
|
sqlite3_filename_database
|
||||||
|
sqlite3_filename_journal
|
||||||
|
sqlite3_filename_wal
|
||||||
|
sqlite3_finalize
|
||||||
|
sqlite3_free
|
||||||
|
sqlite3_free_filename
|
||||||
|
sqlite3_free_table
|
||||||
|
sqlite3_get_autocommit
|
||||||
|
sqlite3_get_auxdata
|
||||||
|
sqlite3_get_clientdata
|
||||||
|
sqlite3_get_table
|
||||||
|
sqlite3_global_recover
|
||||||
|
sqlite3_hard_heap_limit64
|
||||||
|
sqlite3_initialize
|
||||||
|
sqlite3_interrupt
|
||||||
|
sqlite3_is_interrupted
|
||||||
|
sqlite3_keyword_check
|
||||||
|
sqlite3_keyword_count
|
||||||
|
sqlite3_keyword_name
|
||||||
|
sqlite3_last_insert_rowid
|
||||||
|
sqlite3_libversion
|
||||||
|
sqlite3_libversion_number
|
||||||
|
sqlite3_limit
|
||||||
|
sqlite3_load_extension
|
||||||
|
sqlite3_log
|
||||||
|
sqlite3_malloc
|
||||||
|
sqlite3_malloc64
|
||||||
|
sqlite3_memory_alarm
|
||||||
|
sqlite3_memory_highwater
|
||||||
|
sqlite3_memory_used
|
||||||
|
sqlite3_mprintf
|
||||||
|
sqlite3_msize
|
||||||
|
sqlite3_mutex_alloc
|
||||||
|
sqlite3_mutex_enter
|
||||||
|
sqlite3_mutex_free
|
||||||
|
sqlite3_mutex_leave
|
||||||
|
sqlite3_mutex_try
|
||||||
|
sqlite3_next_stmt
|
||||||
|
sqlite3_open
|
||||||
|
sqlite3_open_v2
|
||||||
|
sqlite3_open16
|
||||||
|
sqlite3_os_end
|
||||||
|
sqlite3_os_init
|
||||||
|
sqlite3_overload_function
|
||||||
|
sqlite3_prepare
|
||||||
|
sqlite3_prepare_v2
|
||||||
|
sqlite3_prepare_v3
|
||||||
|
sqlite3_prepare16
|
||||||
|
sqlite3_prepare16_v2
|
||||||
|
sqlite3_prepare16_v3
|
||||||
|
sqlite3_preupdate_blobwrite
|
||||||
|
sqlite3_preupdate_count
|
||||||
|
sqlite3_preupdate_depth
|
||||||
|
sqlite3_preupdate_hook
|
||||||
|
sqlite3_preupdate_new
|
||||||
|
sqlite3_preupdate_old
|
||||||
|
sqlite3_profile
|
||||||
|
sqlite3_progress_handler
|
||||||
|
sqlite3_randomness
|
||||||
|
sqlite3_realloc
|
||||||
|
sqlite3_realloc64
|
||||||
|
sqlite3_release_memory
|
||||||
|
sqlite3_reset
|
||||||
|
sqlite3_reset_auto_extension
|
||||||
|
sqlite3_result_blob
|
||||||
|
sqlite3_result_blob64
|
||||||
|
sqlite3_result_double
|
||||||
|
sqlite3_result_error
|
||||||
|
sqlite3_result_error_code
|
||||||
|
sqlite3_result_error_nomem
|
||||||
|
sqlite3_result_error_toobig
|
||||||
|
sqlite3_result_error16
|
||||||
|
sqlite3_result_int
|
||||||
|
sqlite3_result_int64
|
||||||
|
sqlite3_result_null
|
||||||
|
sqlite3_result_pointer
|
||||||
|
sqlite3_result_subtype
|
||||||
|
sqlite3_result_text
|
||||||
|
sqlite3_result_text16
|
||||||
|
sqlite3_result_text16be
|
||||||
|
sqlite3_result_text16le
|
||||||
|
sqlite3_result_text64
|
||||||
|
sqlite3_result_value
|
||||||
|
sqlite3_result_zeroblob
|
||||||
|
sqlite3_result_zeroblob64
|
||||||
|
sqlite3_rollback_hook
|
||||||
|
sqlite3_rtree_geometry_callback
|
||||||
|
sqlite3_rtree_query_callback
|
||||||
|
sqlite3_serialize
|
||||||
|
sqlite3_set_authorizer
|
||||||
|
sqlite3_set_auxdata
|
||||||
|
sqlite3_set_clientdata
|
||||||
|
sqlite3_set_last_insert_rowid
|
||||||
|
sqlite3_shutdown
|
||||||
|
sqlite3_sleep
|
||||||
|
sqlite3_snprintf
|
||||||
|
sqlite3_soft_heap_limit
|
||||||
|
sqlite3_soft_heap_limit64
|
||||||
|
sqlite3_sourceid
|
||||||
|
sqlite3_sql
|
||||||
|
sqlite3_status
|
||||||
|
sqlite3_status64
|
||||||
|
sqlite3_step
|
||||||
|
sqlite3_stmt_busy
|
||||||
|
sqlite3_stmt_explain
|
||||||
|
sqlite3_stmt_isexplain
|
||||||
|
sqlite3_stmt_readonly
|
||||||
|
sqlite3_stmt_status
|
||||||
|
sqlite3_str_append
|
||||||
|
sqlite3_str_appendall
|
||||||
|
sqlite3_str_appendchar
|
||||||
|
sqlite3_str_appendf
|
||||||
|
sqlite3_str_errcode
|
||||||
|
sqlite3_str_finish
|
||||||
|
sqlite3_str_length
|
||||||
|
sqlite3_str_new
|
||||||
|
sqlite3_str_reset
|
||||||
|
sqlite3_str_value
|
||||||
|
sqlite3_str_vappendf
|
||||||
|
sqlite3_strglob
|
||||||
|
sqlite3_stricmp
|
||||||
|
sqlite3_strlike
|
||||||
|
sqlite3_strnicmp
|
||||||
|
sqlite3_system_errno
|
||||||
|
sqlite3_table_column_metadata
|
||||||
|
sqlite3_temp_directory
|
||||||
|
sqlite3_test_control
|
||||||
|
sqlite3_thread_cleanup
|
||||||
|
sqlite3_threadsafe
|
||||||
|
sqlite3_total_changes
|
||||||
|
sqlite3_total_changes64
|
||||||
|
sqlite3_trace
|
||||||
|
sqlite3_trace_v2
|
||||||
|
sqlite3_transfer_bindings
|
||||||
|
sqlite3_txn_state
|
||||||
|
sqlite3_update_hook
|
||||||
|
sqlite3_uri_boolean
|
||||||
|
sqlite3_uri_int64
|
||||||
|
sqlite3_uri_key
|
||||||
|
sqlite3_uri_parameter
|
||||||
|
sqlite3_user_data
|
||||||
|
sqlite3_value_blob
|
||||||
|
sqlite3_value_bytes
|
||||||
|
sqlite3_value_bytes16
|
||||||
|
sqlite3_value_double
|
||||||
|
sqlite3_value_dup
|
||||||
|
sqlite3_value_encoding
|
||||||
|
sqlite3_value_free
|
||||||
|
sqlite3_value_frombind
|
||||||
|
sqlite3_value_int
|
||||||
|
sqlite3_value_int64
|
||||||
|
sqlite3_value_nochange
|
||||||
|
sqlite3_value_numeric_type
|
||||||
|
sqlite3_value_pointer
|
||||||
|
sqlite3_value_subtype
|
||||||
|
sqlite3_value_text
|
||||||
|
sqlite3_value_text16
|
||||||
|
sqlite3_value_text16be
|
||||||
|
sqlite3_value_text16le
|
||||||
|
sqlite3_value_type
|
||||||
|
sqlite3_version
|
||||||
|
sqlite3_vfs_find
|
||||||
|
sqlite3_vfs_register
|
||||||
|
sqlite3_vfs_unregister
|
||||||
|
sqlite3_vmprintf
|
||||||
|
sqlite3_vsnprintf
|
||||||
|
sqlite3_vtab_collation
|
||||||
|
sqlite3_vtab_config
|
||||||
|
sqlite3_vtab_distinct
|
||||||
|
sqlite3_vtab_in
|
||||||
|
sqlite3_vtab_in_first
|
||||||
|
sqlite3_vtab_in_next
|
||||||
|
sqlite3_vtab_nochange
|
||||||
|
sqlite3_vtab_on_conflict
|
||||||
|
sqlite3_vtab_rhs_value
|
||||||
|
sqlite3_wal_autocheckpoint
|
||||||
|
sqlite3_wal_checkpoint
|
||||||
|
sqlite3_wal_checkpoint_v2
|
||||||
|
sqlite3_wal_hook
|
||||||
|
sqlite3_win32_is_nt
|
||||||
|
sqlite3_win32_mbcs_to_utf8
|
||||||
|
sqlite3_win32_mbcs_to_utf8_v2
|
||||||
|
sqlite3_win32_set_directory
|
||||||
|
sqlite3_win32_set_directory16
|
||||||
|
sqlite3_win32_set_directory8
|
||||||
|
sqlite3_win32_sleep
|
||||||
|
sqlite3_win32_unicode_to_utf8
|
||||||
|
sqlite3_win32_utf8_to_mbcs
|
||||||
|
sqlite3_win32_utf8_to_mbcs_v2
|
||||||
|
sqlite3_win32_utf8_to_unicode
|
||||||
|
sqlite3_win32_write_debug
|
||||||
|
sqlite3changegroup_add
|
||||||
|
sqlite3changegroup_add_change
|
||||||
|
sqlite3changegroup_add_strm
|
||||||
|
sqlite3changegroup_delete
|
||||||
|
sqlite3changegroup_new
|
||||||
|
sqlite3changegroup_output
|
||||||
|
sqlite3changegroup_output_strm
|
||||||
|
sqlite3changegroup_schema
|
||||||
|
sqlite3changeset_apply
|
||||||
|
sqlite3changeset_apply_strm
|
||||||
|
sqlite3changeset_apply_v2
|
||||||
|
sqlite3changeset_apply_v2_strm
|
||||||
|
sqlite3changeset_concat
|
||||||
|
sqlite3changeset_concat_strm
|
||||||
|
sqlite3changeset_conflict
|
||||||
|
sqlite3changeset_finalize
|
||||||
|
sqlite3changeset_fk_conflicts
|
||||||
|
sqlite3changeset_invert
|
||||||
|
sqlite3changeset_invert_strm
|
||||||
|
sqlite3changeset_new
|
||||||
|
sqlite3changeset_next
|
||||||
|
sqlite3changeset_old
|
||||||
|
sqlite3changeset_op
|
||||||
|
sqlite3changeset_pk
|
||||||
|
sqlite3changeset_start
|
||||||
|
sqlite3changeset_start_strm
|
||||||
|
sqlite3changeset_start_v2
|
||||||
|
sqlite3changeset_start_v2_strm
|
||||||
|
sqlite3rbu_bp_progress
|
||||||
|
sqlite3rbu_close
|
||||||
|
sqlite3rbu_create_vfs
|
||||||
|
sqlite3rbu_db
|
||||||
|
sqlite3rbu_destroy_vfs
|
||||||
|
sqlite3rbu_open
|
||||||
|
sqlite3rbu_progress
|
||||||
|
sqlite3rbu_rename_handler
|
||||||
|
sqlite3rbu_savestate
|
||||||
|
sqlite3rbu_state
|
||||||
|
sqlite3rbu_step
|
||||||
|
sqlite3rbu_temp_size
|
||||||
|
sqlite3rbu_temp_size_limit
|
||||||
|
sqlite3rbu_vacuum
|
||||||
|
sqlite3rebaser_configure
|
||||||
|
sqlite3rebaser_create
|
||||||
|
sqlite3rebaser_delete
|
||||||
|
sqlite3rebaser_rebase
|
||||||
|
sqlite3rebaser_rebase_strm
|
||||||
|
sqlite3session_attach
|
||||||
|
sqlite3session_changeset
|
||||||
|
sqlite3session_changeset_size
|
||||||
|
sqlite3session_changeset_strm
|
||||||
|
sqlite3session_config
|
||||||
|
sqlite3session_create
|
||||||
|
sqlite3session_delete
|
||||||
|
sqlite3session_diff
|
||||||
|
sqlite3session_enable
|
||||||
|
sqlite3session_indirect
|
||||||
|
sqlite3session_isempty
|
||||||
|
sqlite3session_memory_used
|
||||||
|
sqlite3session_object_config
|
||||||
|
sqlite3session_patchset
|
||||||
|
sqlite3session_patchset_strm
|
||||||
|
sqlite3session_table_filter
|
BIN
sqlite3_64.dll
Normal file
BIN
sqlite3_64.dll
Normal file
Binary file not shown.
|
@ -16,7 +16,7 @@ sql"""CREATE TABLE IF NOT EXISTS keys(
|
||||||
proc index*(ctx: Context) {.async.} =
|
proc index*(ctx: Context) {.async.} =
|
||||||
for x in db.fastRows(sql"SELECT * FROM keys"):
|
for x in db.fastRows(sql"SELECT * FROM keys"):
|
||||||
echo x
|
echo x
|
||||||
await ctx.staticFileResponse("web/index.html", "")
|
await ctx.staticFileResponse("public/index.html", "")
|
||||||
|
|
||||||
proc ip_exists*(ip: string): bool =
|
proc ip_exists*(ip: string): bool =
|
||||||
return len(db.getAllRows(sql"SELECT * FROM keys WHERE ip=?", ip)) != 0
|
return len(db.getAllRows(sql"SELECT * FROM keys WHERE ip=?", ip)) != 0
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
version: '3'
|
version: '3'
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
build:
|
build-backend:
|
||||||
cmds:
|
cmds:
|
||||||
# build backend
|
|
||||||
- rm gw
|
- rm gw
|
||||||
- nimble c -d:usestd src/gw.nim -o:gw
|
- nimble c -d:usestd src/gw.nim -o:gw
|
||||||
# build frontend
|
build-frontend:
|
||||||
- cd web
|
dir: ./web
|
||||||
|
cmds:
|
||||||
- pnpm install
|
- pnpm install
|
||||||
- pnpm run build
|
- pnpm run build
|
||||||
dev-backend:
|
dev-backend:
|
||||||
|
|
|
@ -1,107 +1,144 @@
|
||||||
import { useEffect, useState } from 'preact/hooks';
|
import { useEffect, useState } from 'preact/hooks';
|
||||||
|
|
||||||
type EntryBody = {
|
type EntryBody = {
|
||||||
err: boolean;
|
err: boolean;
|
||||||
referral: string;
|
referral: string;
|
||||||
key: string;
|
key: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const Home = () => {
|
export const Home = () => {
|
||||||
const [referral, setReferral] = useState('');
|
const [referral, setReferral] = useState('');
|
||||||
const [entryBody, setEntryBody] = useState<EntryBody | null>({
|
const [entryBody, setEntryBody] = useState<EntryBody | null>({
|
||||||
err: true,
|
err: true,
|
||||||
referral: '',
|
referral: '',
|
||||||
key: ''
|
key: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [timeLeft, setTimeLeft] = useState<string>('...');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log('Referral:', referral);
|
||||||
|
}, [referral]);
|
||||||
|
|
||||||
|
const entry = async () => {
|
||||||
|
let res = await fetch("http://localhost:8080/entry", {
|
||||||
|
method: 'GET',
|
||||||
|
headers: { referral }
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
console.error('Error:', res.status);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let body: EntryBody = await res.json();
|
||||||
|
|
||||||
|
if (body.err) {
|
||||||
|
console.error('Error:', body.referral);
|
||||||
|
window.location.href = '/error';
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Entry:', body);
|
||||||
|
|
||||||
|
setEntryBody(body);
|
||||||
|
|
||||||
|
setReferral('');
|
||||||
|
}
|
||||||
|
|
||||||
|
const eventDateCET = new Date('2025-01-01T00:00:00Z');
|
||||||
|
const userTime = new Intl.DateTimeFormat(undefined, {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
timeZoneName: 'short'
|
||||||
|
}).format(eventDateCET);
|
||||||
|
|
||||||
|
const getTimeLeft = (date: Date) => {
|
||||||
|
const now = new Date();
|
||||||
|
const diff = date.getTime() - now.getTime();
|
||||||
|
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
||||||
|
const hours = Math.floor(diff / (1000 * 60 * 60) % 24);
|
||||||
|
const minutes = Math.floor(diff / (1000 * 60) % 60);
|
||||||
|
const seconds = Math.floor(diff / 1000 % 60);
|
||||||
|
|
||||||
|
let s = "";
|
||||||
|
if (days > 0) s += days + "d ";
|
||||||
|
if (hours > 0) s += hours + "h ";
|
||||||
|
if (minutes > 0) s += minutes + "m ";
|
||||||
|
if (seconds > 0) s += seconds + "s";
|
||||||
|
|
||||||
|
if (s === "") s = "the time is upon us.";
|
||||||
|
else s += " remaining.";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log('Referral:', referral);
|
const interval = setInterval(() => {
|
||||||
}, [referral]);
|
setTimeLeft(getTimeLeft(eventDateCET));
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
const entry = async () => {
|
return () => clearInterval(interval);
|
||||||
let res = await fetch("http://localhost:8080/entry", {
|
}, []);
|
||||||
method: 'GET',
|
|
||||||
headers: { referral }
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
console.error('Error:', res.status);
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let body: EntryBody = await res.json();
|
return (
|
||||||
|
<div class="flex flex-col gap-6 w-full h-full justify-center items-center">
|
||||||
|
<h1 class="text-6xl font-bold animate-pulse">???</h1>
|
||||||
|
<p>{timeLeft}</p>
|
||||||
|
|
||||||
|
<span>
|
||||||
|
<p class="opacity-100 hover:opacity-75 transition-opacity">
|
||||||
|
Referral:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={referral}
|
||||||
|
onInput={(e) => setReferral(e.currentTarget.value)}
|
||||||
|
|
||||||
if (body.err) {
|
class="bg-black text-green-500 border-green-500 border-2 px-2 hover:bg-green-500 hover:text-black active:bg-green-500 active:text-black transition-colors"
|
||||||
console.error('Error:', body.referral);
|
/>
|
||||||
window.location.href = '/error';
|
|
||||||
|
|
||||||
return
|
<button
|
||||||
}
|
onClick={async () => await entry()}
|
||||||
|
class="bg-green-500 text-black hover:bg-black hover:text-green-500 transition-colors px-4"
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
|
||||||
console.log('Entry:', body);
|
{
|
||||||
|
!entryBody.err ? (
|
||||||
setEntryBody(body);
|
<div class="flex flex-col gap-1.5 mt-3 justify-center items-center">
|
||||||
|
<p class="text-green-700">tip: click to copy.</p>
|
||||||
|
<h2 onClick={() => navigator.clipboard.writeText(entryBody?.key)}>Key: <code class="cursor-pointer bg-green-800 hover:bg-green-900 active:bg-green-700 transition-colors py-1 px-2 rounded-lg text-white">{entryBody?.key}</code></h2>
|
||||||
|
<h2 onClick={() => navigator.clipboard.writeText(entryBody?.referral)}>Referral: <code class="cursor-pointer bg-green-800 hover:bg-green-900 active:bg-green-700 transition-colors py-1 px-2 rounded-lg text-white">{entryBody?.referral}</code></h2>
|
||||||
|
<p class="text-green-700">good luck. keep note of these, if you lose them, you can't reroll.</p>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div class="w-2/3 text-center flex flex-col gap-2">
|
||||||
|
<div>
|
||||||
|
<b>What is this?</b>
|
||||||
|
<p>At exactly {userTime} (00:00 CET on 1 Jan), the system will choose a random entry. Their referral key shall be publicly
|
||||||
|
displayed on this page. The person associated with this referral key shall contact us with their private key.
|
||||||
|
They shall win a little prize. To have one's entry weigh more than the rest, one shall have to spread their
|
||||||
|
referral key amongst people. Every referral shall increase their chance of getting selected.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
setReferral('');
|
<div>
|
||||||
}
|
<b>How does one enter?</b>
|
||||||
|
<p>One needs a referral key to enter.</p>
|
||||||
return (
|
</div>
|
||||||
<div class="flex flex-col gap-6 w-full h-full justify-center items-center">
|
</div>
|
||||||
<h1 class="text-6xl font-bold animate-pulse">???</h1>
|
)
|
||||||
<p>time left here</p>
|
}
|
||||||
<div class="flex flex-col justify-center items-center gap-4">
|
|
||||||
<span>
|
|
||||||
<p class="opacity-100 hover:opacity-75 transition-opacity">
|
|
||||||
Referral:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
value={referral}
|
|
||||||
onInput={(e) => setReferral(e.currentTarget.value)}
|
|
||||||
|
|
||||||
class="bg-black text-green-500 border-green-500 border-2 px-2 hover:bg-green-500 hover:text-black active:bg-green-500 active:text-black transition-colors"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<button
|
|
||||||
onClick={async () => await entry()}
|
|
||||||
class="bg-green-500 text-black hover:bg-black hover:text-green-500 transition-colors px-4"
|
|
||||||
>
|
|
||||||
Submit
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
{
|
|
||||||
!entryBody.err ? (
|
|
||||||
<div class="flex flex-col gap-1.5 mt-3 justify-center items-center">
|
|
||||||
<p class="text-green-700">tip: click to copy.</p>
|
|
||||||
<h2 onClick={() => navigator.clipboard.writeText(entryBody?.key)}>Key: <code class="cursor-pointer bg-green-800 hover:bg-green-900 active:bg-green-700 transition-colors py-1 px-2 rounded-lg text-white">{entryBody?.key}</code></h2>
|
|
||||||
<h2 onClick={() => navigator.clipboard.writeText(entryBody?.referral)}>Referral: <code class="cursor-pointer bg-green-800 hover:bg-green-900 active:bg-green-700 transition-colors py-1 px-2 rounded-lg text-white">{entryBody?.referral}</code></h2>
|
|
||||||
<p class="text-green-700">good luck. keep note of these, if you lose them, you can't reroll.</p>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<div class="w-2/3 text-center flex flex-col gap-2">
|
|
||||||
<div>
|
|
||||||
<b>What is this?</b>
|
|
||||||
<p>At exactly 00:00 CET on 1 Jan, the system will choose a random entry. Their referral key shall be publically
|
|
||||||
displayed on this page. The person associated to this referral key shall contact us with their private key.
|
|
||||||
They shall win a little prize. To have one's entry weigh more than the rest, one shall have to spread their
|
|
||||||
referral key amongst the people. Every referral shall increase their chance of getting selected.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<b>How does one enter?</b>
|
|
||||||
<p>One needs a referral key to enter.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
};
|
};
|
|
@ -1,10 +1,14 @@
|
||||||
import preact from '@preact/preset-vite';
|
import preact from '@preact/preset-vite';
|
||||||
import { defineConfig } from 'vite';
|
import { defineConfig } from 'vite';
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [preact()],
|
base: '/public',
|
||||||
server: {
|
plugins: [preact()],
|
||||||
cors: true
|
server: {
|
||||||
}
|
cors: true
|
||||||
});
|
},
|
||||||
|
build: {
|
||||||
|
outDir: '../public',
|
||||||
|
emptyOutDir: true
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in a new issue