summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2019-07-25 14:30:04 +0200
committerYorhel <git@yorhel.nl>2019-07-25 14:36:21 +0200
commitf296495a912ce759df11c43e78b4552788bdbff2 (patch)
tree0c10802de65fb7c8475722e12234bff5eb980628 /util
parent0f3cfeb85caec6424bcbea47142eefbf8011636b (diff)
Merge the v3 branch into separate namespace + fix Docker stuff (again)
I was getting tired of having to keep two branches up-to-date with the latest developments, so decided to throw v3 into the same branch - just different files (...which will get mostly rewritten again soon). The two versions aren't very different in terms of dependencies, build system and support code, so they can now properly share files. Added a section to the README to avoid confusion. This merge also makes it easier to quickly switch between the different versions, which is handy for development. It's even possible to run both at the same time, but my scripts use the same port so that needs a workaround. And it's amazing how often I break the Docker scripts.
Diffstat (limited to 'util')
-rwxr-xr-xutil/docker-init.sh11
-rwxr-xr-xutil/elmgen.pl204
-rw-r--r--util/sql/schema.sql2
-rwxr-xr-xutil/vndb-dev-server.pl8
-rwxr-xr-xutil/vndb3.pl70
5 files changed, 289 insertions, 6 deletions
diff --git a/util/docker-init.sh b/util/docker-init.sh
index 31c1f415..0ac0aca1 100755
--- a/util/docker-init.sh
+++ b/util/docker-init.sh
@@ -67,7 +67,7 @@ pg_start() {
read -p "Choice: " opt
if [[ $opt =~ ^[Yy] ]]
then
- curl https://s.vndb.org/devdump.tar.gz | tar -xzf-
+ curl -L https://dl.vndb.org/dump/vndb-dev-latest.tar.gz | tar -xzf-
psql -U vndb -f dump.sql
rm dump.sql
fi
@@ -83,7 +83,7 @@ pg_start() {
# Should run as devuser
devshell() {
cd /var/www
- util/vndb-dev-server.pl
+ util/vndb-dev-server.pl $1
bash
}
@@ -94,10 +94,15 @@ case "$1" in
su devuser -c '/var/www/util/docker-init.sh pg_start'
exec su devuser -c '/var/www/util/docker-init.sh devshell'
;;
+ 3)
+ mkdevuser
+ su devuser -c '/var/www/util/docker-init.sh pg_start'
+ exec su devuser -c '/var/www/util/docker-init.sh devshell 3'
+ ;;
pg_start)
pg_start
;;
devshell)
- devshell
+ devshell $2
;;
esac
diff --git a/util/elmgen.pl b/util/elmgen.pl
new file mode 100755
index 00000000..d95aba58
--- /dev/null
+++ b/util/elmgen.pl
@@ -0,0 +1,204 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Cwd 'abs_path';
+my $ROOT;
+BEGIN { ($ROOT = abs_path $0) =~ s{/util/elmgen\.pl$}{}; }
+use lib $ROOT.'/lib';
+use TUWF;
+use VN3::Validation;
+use VN3::Auth;
+use VN3::Types;
+use VN3::VN::Edit;
+use VN3::Release::Edit;
+use VN3::Producer::Edit;
+use VN3::Char::Edit;
+use VN3::Staff::Edit;
+use VN3::Docs::Edit;
+use VN3::User::Settings;
+
+my $conf = require $ROOT.'/data/config3.pl';
+
+
+sub indent($) { $_[0] =~ s/\n/\n /gr }
+sub list { indent "[ ".join("\n, ", @_)."\n]" }
+sub string($) { '"'.($_[0] =~ s/([\\"])/\\$1/gr).'"' }
+sub tuple { '('.join(', ', @_).')' }
+
+sub to_camel($) { (ucfirst $_[0]) =~ s/_([a-z])/'_'.uc $1/egr; }
+
+sub nested_type {
+ my($prefix, $obj) = @_;
+ my @keys = $obj->{keys} ? grep $obj->{keys}{$_}{keys}||($obj->{keys}{$_}{values}&&$obj->{keys}{$_}{values}{keys}), sort keys %{$obj->{keys}} : ();
+
+ nested_type($prefix . to_camel $_, $obj->{keys}{$_}{values} || $obj->{keys}{$_}) for @keys;
+
+ printf "type alias %s = %s\n\n", $prefix, $obj->elm_type(
+ keys => +{ map +($_, ($obj->{keys}{$_}{values} ? 'List ' : '') . $prefix . to_camel $_), @keys }
+ );
+}
+
+sub encoder {
+ my($name, $type, $obj) = @_;
+ printf "%s : %s -> JE.Value\n", $name, $type;
+ printf "%s = %s\n\n", $name, $obj->elm_encoder(json_encode => 'JE.');
+}
+
+
+
+my $perms = VN3::Auth::listPerms();
+
+my $vn_lengths = list map tuple($_, string vn_length_display $_), 0..$#VN_LENGTHS;
+my $vn_relations = list map tuple(string $_, string vn_relation_display $_), vn_relations;
+my $producer_relations=list map tuple(string $_, string producer_relation_display $_), keys %PRODUCER_RELATIONS;
+my $staff_roles = list map tuple(string $_, string $STAFF_ROLES{$_}), keys %STAFF_ROLES;
+my $user_perms = list map tuple($perms->{$_}, string $_), sort keys %$perms;
+my $languages = list map tuple(string $_, string $LANG{$_}), sort { $LANG{$a} cmp $LANG{$b} } keys %LANG;
+my $platforms = list map tuple(string $_, string $PLATFORMS{$_}), keys %PLATFORMS;
+my $release_types= list map string($_), release_types;
+my $producer_types=list map tuple(string $_, string $PRODUCER_TYPES{$_}), keys %PRODUCER_TYPES;
+my $minages = list map tuple($_, string minage_display_full $_), @MINAGE;
+my $resolutions = list map tuple(string $_, string resolution_display_full $_), keys %RESOLUTIONS;
+my $voiced = list map string($_), @VOICED;
+my $animated = list map string($_), @ANIMATED;
+my $gender = list map tuple(string $_, string gender_display $_), keys %GENDERS;
+my $bloodt = list map tuple(string $_, string blood_type_display $_), keys %BLOOD_TYPES;
+my $charroles = list map tuple(string $_, string char_role_display $_), keys %CHAR_ROLES;
+my $media = list map tuple(string($_), sprintf('{ qty = %s, single = %s, plural = %s }',
+ $MEDIA{$_}{qty} ? 'True' : 'False',
+ string($MEDIA{$_}{single}), string($MEDIA{$_}{plural}))), keys %MEDIA;
+my $vnlist_status= list map tuple($_, string $VNLIST_STATUS[$_]), 0..$#VNLIST_STATUS;
+my $email = string { tuwf->compile({ email => 1 })->analyze->html5_validation() }->{pattern};
+my $weburl = string { tuwf->compile({ weburl => 1 })->analyze->html5_validation() }->{pattern};
+my $vnvote = string { tuwf->compile({ vnvote => 1 })->analyze->html5_validation() }->{pattern};
+
+
+print <<"EOF";
+-- This file is automatically generated from util/elmgen.pl
+-- DO NOT EDIT!
+module Lib.Gen exposing (..)
+
+import Json.Encode as JE
+
+urlStatic : String
+urlStatic = "$conf->{url_static}"
+
+vnLengths : List (Int, String)
+vnLengths =
+ $vn_lengths
+
+vnRelations : List (String, String)
+vnRelations =
+ $vn_relations
+
+producerRelations : List (String, String)
+producerRelations =
+ $producer_relations
+
+staffRoles : List (String, String)
+staffRoles =
+ $staff_roles
+
+userPerms : List (Int, String)
+userPerms =
+ $user_perms
+
+languages : List (String, String)
+languages =
+ $languages
+
+platforms : List (String, String)
+platforms =
+ $platforms
+
+releaseTypes : List String
+releaseTypes =
+ $release_types
+
+producerTypes : List (String, String)
+producerTypes =
+ $producer_types
+
+minAges : List (Int, String)
+minAges =
+ $minages
+
+resolutions : List (String, String)
+resolutions =
+ $resolutions
+
+voiced : List String
+voiced =
+ $voiced
+
+animated : List String
+animated =
+ $animated
+
+genders : List (String, String)
+genders =
+ $gender
+
+bloodTypes : List (String, String)
+bloodTypes =
+ $bloodt
+
+charRoles : List (String, String)
+charRoles =
+ $charroles
+
+type alias Medium =
+ { qty : Bool
+ , single : String
+ , plural : String
+ }
+
+media : List (String, Medium)
+media =
+ $media
+
+vnlistStatus : List (Int, String)
+vnlistStatus =
+ $vnlist_status
+
+emailPattern : String
+emailPattern = $email
+
+weburlPattern : String
+weburlPattern = $weburl
+
+vnvotePattern : String
+vnvotePattern = $vnvote
+
+EOF
+
+
+nested_type VNEdit => $VN3::VN::Edit::FORM_OUT->analyze;
+nested_type VNEditSend => $VN3::VN::Edit::FORM_IN->analyze;
+encoder vneditSendEncode => VNEditSend => $VN3::VN::Edit::FORM_IN->analyze;
+
+nested_type RelEdit => $VN3::Release::Edit::FORM_OUT->analyze;
+nested_type RelEditSend => $VN3::Release::Edit::FORM_IN->analyze;
+encoder releditSendEncode => RelEditSend => $VN3::Release::Edit::FORM_IN->analyze;
+
+nested_type ProdEdit => $VN3::Producer::Edit::FORM_OUT->analyze;
+nested_type ProdEditSend => $VN3::Producer::Edit::FORM_IN->analyze;
+encoder prodeditSendEncode => ProdEditSend => $VN3::Producer::Edit::FORM_IN->analyze;
+
+nested_type CharEdit => $VN3::Char::Edit::FORM_OUT->analyze;
+nested_type CharEditSend => $VN3::Char::Edit::FORM_IN->analyze;
+encoder chareditSendEncode => CharEditSend => $VN3::Char::Edit::FORM_IN->analyze;
+
+nested_type StaffEdit => $VN3::Staff::Edit::FORM_OUT->analyze;
+nested_type StaffEditSend => $VN3::Staff::Edit::FORM_IN->analyze;
+encoder staffeditSendEncode => StaffEditSend => $VN3::Staff::Edit::FORM_IN->analyze;
+
+nested_type DocEdit => $VN3::Docs::Edit::FORM_OUT->analyze;
+nested_type DocEditSend => $VN3::Docs::Edit::FORM_IN->analyze;
+encoder doceditSendEncode => DocEditSend => $VN3::Docs::Edit::FORM_IN->analyze;
+
+nested_type UserEdit => $VN3::User::Settings::FORM_OUT->analyze;
+nested_type UserEditSend => $VN3::User::Settings::FORM_IN->analyze;
+encoder usereditSendEncode => UserEditSend => $VN3::User::Settings::FORM_IN->analyze;
diff --git a/util/sql/schema.sql b/util/sql/schema.sql
index b62b33a8..c76fc88a 100644
--- a/util/sql/schema.sql
+++ b/util/sql/schema.sql
@@ -65,7 +65,7 @@ CREATE TABLE anime (
ann_id integer, -- [pub]
nfo_id varchar(200), -- [pub]
type anime_type, -- [pub]
- title_romaji varchar(250) -- [pub]
+ title_romaji varchar(250), -- [pub]
title_kanji varchar(250), -- [pub]
lastfetch timestamptz
);
diff --git a/util/vndb-dev-server.pl b/util/vndb-dev-server.pl
index 763748b6..bc23997a 100755
--- a/util/vndb-dev-server.pl
+++ b/util/vndb-dev-server.pl
@@ -15,6 +15,8 @@ use Cwd 'abs_path';
my $listen_port = $ENV{TUWF_HTTP_SERVER_PORT} || 3000;
$ENV{TUWF_HTTP_SERVER_PORT} = $listen_port+1;
+my $script = $ARGV[0] && $ARGV[0] eq '3' ? 'vndb3.pl' : 'vndb.pl';
+
my($pid, $prog, $killed);
sub prog_start {
@@ -28,7 +30,7 @@ sub prog_start {
}
print $d;
};
- $prog = run_cmd "$ROOT/util/vndb.pl",
+ $prog = run_cmd "$ROOT/util/$script",
'$$' => \$pid,
'>' => $output,
'2>' => $output;
@@ -102,7 +104,9 @@ sub checkmod {
chdir $ROOT;
$check->($_) for (qw{
util/vndb.pl
+ util/vndb3.pl
data/config.pl
+ data/config3.pl
data/global.pl
});
@@ -150,6 +154,6 @@ while(1) {
my $prog_conn = AE::cv;
tcp_connect '127.0.0.1', $ENV{TUWF_HTTP_SERVER_PORT}, sub { $prog_conn->send(shift); };
- my $prog_fh = $prog_conn->recv || die "Unable to connect to vndb.pl? $!";
+ my $prog_fh = $prog_conn->recv || die "Unable to connect to $script? $!";
pipe_fhs($serv_fh, $prog_fh);
}
diff --git a/util/vndb3.pl b/util/vndb3.pl
new file mode 100755
index 00000000..d2f18833
--- /dev/null
+++ b/util/vndb3.pl
@@ -0,0 +1,70 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use TUWF;
+
+use Cwd 'abs_path';
+my $ROOT;
+BEGIN { ($ROOT = abs_path $0) =~ s{/util/vndb3\.pl$}{}; }
+use lib $ROOT.'/lib';
+
+use PWLookup;
+
+$|=1; # Disable buffering on STDOUT, otherwise vndb-dev-server.pl won't pick up our readyness notification.
+
+my $conf = require $ROOT.'/data/config3.pl';
+
+# Make the configuration available as tuwf->conf
+sub TUWF::Object::conf { $conf }
+
+
+# Make our root path available as tuwf->root
+# Optionally accepts other path components to assemble a file path:
+# tuwf->root('static/sf/01/1.jpg')
+sub TUWF::Object::root { shift; join '/', $ROOT, @_ }
+
+
+# tuwf->imgpath(cg => $image_id)
+sub TUWF::Object::imgpath {
+ tuwf->root(static => $_[1] => sprintf '%02d/%d.jpg', $_[2]%100, $_[2]);
+}
+
+
+# tuwf->imgurl(cv => $image_id)
+sub TUWF::Object::imgurl {
+ sprintf '%s/%s/%02d/%d.jpg', $_[0]->conf->{url_static}, $_[1], $_[2]%100, $_[2];
+}
+
+
+# tuwf->resDenied
+sub TUWF::Object::resDenied {
+ TUWF::_very_simple_page(403, '403 - Permission Denied', 'You do not have the permission to access this page.');
+}
+
+# tuwf->isUnsafePass($pass)
+sub TUWF::Object::isUnsafePass {
+ $_[0]->conf->{password_db} && PWLookup::lookup($_[0]->conf->{password_db}, $_[1])
+}
+
+
+TUWF::set %{ $conf->{tuwf} || {} };
+
+TUWF::set import_modules => 0;
+
+# If we're running standalone, serve www/ and static/ too.
+TUWF::hook before => sub {
+ my $static = tuwf->{_TUWF}{http} &&
+ ( tuwf->resFile(tuwf->root('www'), tuwf->reqPath)
+ || tuwf->resFile(tuwf->root('static'), tuwf->reqPath)
+ );
+ if($static) {
+ tuwf->resHeader('Cache-Control' => 'max-age=31536000');
+ tuwf->done;
+ }
+};
+
+
+require VN3::Validation; # Load this early, to ensure the custom_validations are available
+TUWF::load_recursive 'VN3';
+TUWF::run;