├── logs └── .gitkeep ├── app ├── cache │ └── .gitkeep ├── luclient │ └── .gitkeep ├── static │ ├── css │ │ └── .gitkeep │ ├── bootstrap-4.2.1 │ │ └── scss │ │ │ ├── utilities │ │ │ ├── _clearfix.scss │ │ │ ├── _overflow.scss │ │ │ ├── _screenreaders.scss │ │ │ ├── _visibility.scss │ │ │ ├── _shadows.scss │ │ │ ├── _float.scss │ │ │ ├── _align.scss │ │ │ ├── _background.scss │ │ │ ├── _sizing.scss │ │ │ ├── _position.scss │ │ │ ├── _embed.scss │ │ │ ├── _display.scss │ │ │ ├── _borders.scss │ │ │ ├── _text.scss │ │ │ ├── _spacing.scss │ │ │ └── _flex.scss │ │ │ ├── _media.scss │ │ │ ├── mixins │ │ │ ├── _box-shadow.scss │ │ │ ├── _size.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _visibility.scss │ │ │ ├── _lists.scss │ │ │ ├── _text-truncate.scss │ │ │ ├── _resize.scss │ │ │ ├── _float.scss │ │ │ ├── _badge.scss │ │ │ ├── _alert.scss │ │ │ ├── _nav-divider.scss │ │ │ ├── _text-emphasis.scss │ │ │ ├── _transition.scss │ │ │ ├── _text-hide.scss │ │ │ ├── _list-group.scss │ │ │ ├── _pagination.scss │ │ │ ├── _background-variant.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _hover.scss │ │ │ ├── _table-row.scss │ │ │ ├── _image.scss │ │ │ ├── _caret.scss │ │ │ ├── _grid.scss │ │ │ ├── _grid-framework.scss │ │ │ ├── _gradients.scss │ │ │ └── _buttons.scss │ │ │ ├── _transitions.scss │ │ │ ├── _jumbotron.scss │ │ │ ├── bootstrap-reboot.scss │ │ │ ├── _utilities.scss │ │ │ ├── _root.scss │ │ │ ├── bootstrap-grid.scss │ │ │ ├── _progress.scss │ │ │ ├── bootstrap.scss │ │ │ ├── _mixins.scss │ │ │ ├── _toasts.scss │ │ │ ├── _code.scss │ │ │ ├── _spinners.scss │ │ │ ├── _close.scss │ │ │ ├── _grid.scss │ │ │ ├── _badge.scss │ │ │ ├── _images.scss │ │ │ ├── _alert.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _pagination.scss │ │ │ ├── _nav.scss │ │ │ ├── _type.scss │ │ │ ├── _functions.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _buttons.scss │ │ │ ├── _list-group.scss │ │ │ └── _print.scss │ ├── logo │ │ ├── logo.png │ │ └── favicon.ico │ ├── font-awesome │ │ ├── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-solid-900.woff2 │ │ │ └── fa-regular-400.woff2 │ │ ├── attribution.js │ │ └── LICENSE.txt │ ├── lddviewer │ │ ├── main.css │ │ └── base64-binary.js │ └── scss │ │ └── site.scss ├── templates │ ├── partials │ │ ├── _mail.html.j2 │ │ ├── charxml │ │ │ ├── _inventory.html.j2 │ │ │ ├── _zone_stats.html.j2 │ │ │ ├── _inv_grid.html.j2 │ │ │ ├── _stats.html.j2 │ │ │ └── _item_tooltip.html.j2 │ │ ├── _loading.html │ │ ├── _gm_level.html.j2 │ │ └── _property_content.html.j2 │ ├── logs │ │ ├── system.html.j2 │ │ ├── command.html.j2 │ │ ├── audit.html.j2 │ │ └── activity.html.j2 │ ├── flask_user │ │ ├── _common_base.html │ │ ├── _macros.html │ │ ├── register.html │ │ ├── login_or_register.html │ │ └── login.html │ ├── status_codes │ │ └── 500.html.j2 │ ├── character │ │ ├── rescue.html.j2 │ │ ├── upload.html.j2 │ │ ├── view.html.j2 │ │ └── index.html.j2 │ ├── accounts │ │ ├── edit_email.html.j2 │ │ ├── edit_gm_level.html.j2 │ │ ├── view.html.j2 │ │ └── index.html.j2 │ ├── play_keys │ │ ├── bulk.html.j2 │ │ ├── edit.html.j2 │ │ ├── index.html.j2 │ │ └── view.html.j2 │ ├── properties │ │ ├── reject.html.j2 │ │ ├── view.html.j2 │ │ └── index.html.j2 │ ├── bug_reports │ │ ├── index.html.j2 │ │ ├── resolve.html.j2 │ │ └── view.html.j2 │ ├── reports │ │ ├── uscore │ │ │ └── by_date.html.j2 │ │ ├── currency │ │ │ └── by_date.html.j2 │ │ ├── index.html.j2 │ │ ├── items │ │ │ └── by_date.html.j2 │ │ └── graph.html.j2 │ ├── main │ │ ├── index.html.j2 │ │ ├── data_download.html.j2 │ │ ├── about.html.j2 │ │ └── account_creation.html.j2 │ ├── mail │ │ └── send.html.j2 │ ├── _formhelpers.jinja2 │ ├── moderation │ │ └── index.html.j2 │ └── base.html.j2 ├── api.py ├── main.py ├── settings_example.py └── mail.py ├── property_files └── .gitkeep ├── migrations ├── README ├── script.py.mako ├── versions │ ├── b470795db8e1_make_pet_owner_not_a_forein_key.py │ ├── 8a2966b9f7ee_add_column_to_track_times_key_uses.py │ ├── e3e8e05f27ee_pet_owners.py │ ├── aee4c6c24811_reports.py │ ├── a6e42ef03da7_force_play_key_id_to_be_nullable.py │ ├── bd908969d8fe_add_audit_log_table.py │ ├── 3132aaef7413_fix_nullables.py │ ├── 8e52b5c7568a_reporter_id.py │ └── fa97b0d0c351_property_performance_index.py ├── alembic.ini └── env.py ├── entrypoint.bat ├── .dockerignore ├── pylama.ini ├── .gitattributes ├── entrypoint.sh ├── .gitignore ├── requirements.txt ├── Dockerfile ├── wsgi.py ├── .editorconfig ├── .github └── workflows │ └── ci.yml └── Jenkinsfile /logs/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/luclient/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/css/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /property_files/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/templates/partials/_mail.html.j2: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /migrations/README: -------------------------------------------------------------------------------- 1 | Single-database configuration for Flask. 2 | -------------------------------------------------------------------------------- /entrypoint.bat: -------------------------------------------------------------------------------- 1 | python3 -m flask db upgrade 2 | python3 wsgi.py 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | credentials.py 2 | .idea/ 3 | __pycache__/ 4 | venv/ 5 | .git/ -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /app/static/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/logo/logo.png -------------------------------------------------------------------------------- /app/static/logo/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/logo/favicon.ico -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | box-shadow: $shadow; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | } 7 | -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/static/font-awesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkflameUniverse/NexusDashboard/HEAD/app/static/font-awesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /pylama.ini: -------------------------------------------------------------------------------- 1 | [pylama] 2 | ignore = D203, D212, D213, D406, D407, D408, D409, D100, D104, D401, F722 3 | max_line_length = 160 4 | 5 | [pylama:mccabe] 6 | max-complexity = 35 7 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/utilities/_overflow.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $overflows { 4 | .overflow-#{$value} { overflow: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | } 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | app/static/bootstrap-4.2.1/* linguist-vendored=true 2 | app/static/datatables/* linguist-vendored=true 3 | app/static/font-awesome/* linguist-vendored=true 4 | app/static/chartjs/* linguist-vendored=true 5 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /app/static/font-awesome/attribution.js: -------------------------------------------------------------------------------- 1 | console.log(`Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com 2 | License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 3 | `) -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Visibility utilities 3 | // 4 | 5 | .visible { 6 | @include invisible(visible); 7 | } 8 | 9 | .invisible { 10 | @include invisible(hidden); 11 | } 12 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # TODO: preconvert images options 4 | # TODO: preconvery models options 5 | 6 | # update the DB 7 | flask db upgrade 8 | 9 | # RUNNNNNNNNNNNNN 10 | gunicorn -b :8000 -w 4 wsgi:app 11 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left { 4 | float: left !important; 5 | } 6 | @mixin float-right { 7 | float: right !important; 8 | } 9 | @mixin float-none { 10 | float: none !important; 11 | } 12 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | @at-root a#{&} { 6 | @include hover-focus { 7 | color: color-yiq($bg); 8 | background-color: darken($bg, 10%); 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/static/bootstrap-4.2.1/scss/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | } 11 | -------------------------------------------------------------------------------- /app/templates/logs/system.html.j2: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.j2' %} 2 | 3 | {% block title %}LOGS{% endblock %} 4 | 5 | {% block content_before %} 6 | LOGS - {{ config.APP_NAME }} 7 | {% endblock %} 8 | 9 | {% block content_override %} 10 |
12 | {{ logs }}
13 |
14 |
12 | {{ exception }}
13 |
14 | {% else %}
15 | | ID | 24 |Account:Character | 25 |Command | 26 |
|---|
| ID | 24 |Account | 25 |Command | 26 |Date | 27 |
|---|
| ID | 24 |Account:Character | 25 |Activity | 26 |Time | 27 |Map | 28 |
|---|
| Actions | 17 |Reporter | 18 |Body | 19 |Client Version | 20 |Other Player | 21 |Type | 22 |Submitted | 23 |Resolved | 24 |
|---|
| 18 | Character 19 | | 20 |21 | U-Score 22 | | 23 | 24 | 25 | {% for name, uscore in data.items() %} 26 |
|---|---|
| 28 | {{ name }} 29 | | 30 |31 | {{ uscore }} 32 | | 33 | 34 |
| 18 | Character 19 | | 20 |21 | Currency 22 | | 23 | 24 | 25 | {% for name, currency in data.items() %} 26 |
|---|---|
| 28 | {{ name }} 29 | | 30 |31 | {{ currency }} 32 | | 33 | 34 |
| Actions | 24 |Account | 25 |Name | 26 |Pending Name | 27 |Needs Rename | 28 |Last Login | 29 |Permission Map | 30 |
|---|
| Actions | 16 |Name | 17 |GM Level | 19 |Locked | 20 |Banned | 21 |Muted | 22 |Registered | 23 |Email Confirmed | 24 |
|---|
| Actions | 33 |Key | 34 |Uses Left | 35 |Times Used | 36 |Created | 37 |Active | 38 |
|---|
| Actions | 25 |Owner | 26 |Template ID | 27 |Clone ID | 28 |Name | 29 |Description | 30 |Privacy | 31 |Approved | 32 |Updated | 33 |Claimed | 34 |Rejection Reason | 35 |Reputation | 36 |Performance Cost | 37 |Location | 38 |
|---|
{{ e }}
11 | {% endfor %} 12 | {% endif %} 13 || 18 | Item 19 | | 20 |21 | Count 22 | | 23 |24 | Breakdown 25 | | 26 |27 | Rarity 28 | | 29 | 30 | 31 | {% for lot, details in data.items() %} 32 |
|---|---|---|---|
| 34 | {{ lot|get_lot_name }} 35 | | 36 |37 | {% if details.chars %} 38 | {{ details.item_count }} 39 | {% else %} 40 | {{ details }} 41 | {% endif %} 42 | | 43 |
44 | {% if details.chars %}
45 | {% for char, value in details.chars|dictsort(false, 'value')|reverse %}
46 | {{char}}: {{value}} 47 | {% endfor %} 48 | {% else %} 49 | Missing 50 | {% endif %} 51 | |
52 | 53 | {{ lot|get_lot_rarity }} 54 | | 55 |
{{ e }}
11 | {% endfor %} 12 | {% endif %} 13 |{{ e }}
25 | {% endfor %} 26 | {% endif %} 27 |{{ e }}
42 | {% endfor %} 43 | {% endif %} 44 | {%- endmacro %} 45 | 46 | {% macro render_submit_field(field, label=None, tabindex=None) -%} 47 | {% if not label %}{% set label=field.label.text %}{% endif %} 48 | {##} 49 | 52 | {%- endmacro %} 53 | 54 | {% macro sentence_case(text) %} 55 | {{ text[0]|upper}}{{text[1:] }} 56 | {%- endmacro %} 57 | -------------------------------------------------------------------------------- /app/settings_example.py: -------------------------------------------------------------------------------- 1 | # Settings common to all environments (development|staging|production) 2 | 3 | # Application settings 4 | APP_NAME = "Nexus Dashboard" 5 | APP_SYSTEM_ERROR_SUBJECT_LINE = APP_NAME + " system error" 6 | 7 | APP_SECRET_KEY = "" 8 | APP_DATABASE_URI = "mysql+pymysql://
42 |
43 |
44 | {%trans%}Forgot your Password?{%endtrans%}
45 |