LasTres/lib/LasTres/Controller/PJ.pm

220 lines
6.6 KiB
Perl

package LasTres::Controller::PJ;
use v5.36.0;
use strict;
use warnings;
use UUID::URandom qw/create_uuid_string/;
use Try::Tiny;
use LasTres::DAO::PJs;
use LasTres::DAO::Equipments;
use LasTres::DAO::Teams;
use LasTres::DAO::Stats;
use LasTres::DAO::SkillLikeLists;
use LasTres::DAO::Inventories;
use LasTres::Schema;
use LasTres::Races;
use Mojo::Base 'Mojolicious::Controller', -signatures;
my $schema = LasTres::Schema->Schema;
my $result_set_pjs = LasTres::DAO::PJs->ResultSet;
my $result_set_equipments = LasTres::DAO::Equipments->ResultSet;
my $result_set_teams = LasTres::DAO::Teams->ResultSet;
my $result_set_stats = LasTres::DAO::Stats->ResultSet;
my $result_set_skill_like_list = LasTres::DAO::SkillLikeLists->ResultSet;
my $result_set_inventory = LasTres::DAO::Inventories->ResultSet;
sub list_my_pjs ($self) {
my $user = $self->user;
if ( !defined $user ) {
return $self->render(
status => 401,
json => { error => 'You must login first.' }
);
}
my @pjs = $user->pjs;
my @pjs_hash = (
map {
$_->hash;
} @pjs
);
return $self->render(
status => 200,
json => \@pjs_hash,
);
}
sub create ($self) {
my %param = %{ $self->req->json };
my $user = $self->user;
if ( !defined $user ) {
return $self->render(
status => 401,
json => { error => 'You must login first.' }
);
}
my @pjs = $user->pjs;
if ( scalar @pjs >= 3 ) {
return $self->render(
status => 401,
json => {
error =>
'You reached the limit of free pjs, delete one or update to premium.',
}
);
}
my $uuid = create_uuid_string();
my $owner = $user;
my $full_name = $param{full_name};
if ( !defined $full_name || length $full_name < 3 ) {
return $self->render(
status => 400,
json => { error => 'The full_name is too short.', }
);
}
my $short_name = $param{short_name};
if ( !defined $short_name || length $short_name < 3 ) {
return $self->render(
status => 400,
json => { error => 'The short_name is too short.', }
);
}
my $nick = $param{'nick'};
if ( !defined $nick || length $nick <= 0 ) {
return $self->render(
status => 400,
json => { error => 'You must set a nick.', }
);
}
my $race_identifier = $param{'race'};
if ( !defined $race_identifier || !length $race_identifier ) {
return $self->_invalid_race;
}
my $races = LasTres::Races->new;
my $race = $races->hash_playable->{$race_identifier};
if ( !defined $race ) {
return $self->_invalid_race;
}
my $exception;
try {
$schema->txn_do(
sub {
$self->_insert_new_player( $owner, $full_name, $short_name,
$nick, $race );
}
);
}
catch {
$exception = $_;
if ( $_ =~ /Rollback failed/ ) {
say STDERR "Unable to rollback failed transaction:";
}
say STDERR $_;
};
if ( defined $exception ) {
return $self->render(
status => 500,
json => { error => 'Database error' },
);
}
return $self->render(
status => 200,
json => { info => 'Sucessfully created pj.' },
);
}
sub _insert_new_player ( $self, $owner, $full_name, $short_name, $nick, $race )
{
my $uuid_born_stats = create_uuid_string;
my $uuid_training_stats = create_uuid_string;
my $uuid_equipment = create_uuid_string;
my $uuid_skills = create_uuid_string;
my $uuid_spells = create_uuid_string;
my $uuid_pj = create_uuid_string;
my $uuid_inventory = create_uuid_string;
my $uuid_team = create_uuid_string;
my $uuid_owner = $owner->uuid;
my $born_stats = LasTres::Stats->new(
uuid => $uuid_born_stats,
health => $self->_get_random_born_stat,
strength => $self->_get_random_born_stat,
resistance => $self->_get_random_born_stat,
mana => $self->_get_random_born_stat,
magic => $self->_get_random_born_stat,
speed => $self->_get_random_born_stat,
intelligence => $self->_get_random_born_stat,
);
$born_stats->insert;
my $training_stats = LasTres::Stats->new(
uuid => $uuid_training_stats,
health => 0,
strength => 0,
resistance => 0,
mana => 0,
magic => 0,
speed => 0,
intelligence => 0,
);
$training_stats->insert;
$result_set_equipments->new( { uuid => $uuid_equipment } )->insert;
$result_set_skill_like_list->new( { uuid => $uuid_skills } )->insert;
$result_set_skill_like_list->new( { uuid => $uuid_spells } )->insert;
$result_set_inventory->new( { uuid => $uuid_inventory } )->insert;
my $location = $race->spawn;
my $area = $location->parent;
my $super_area = $area->parent;
my $planet = $super_area->parent;
my $team = $result_set_teams->new(
{
uuid => $uuid_team,
leader => undef,
name => $uuid_team,
planet => $planet->identifier,
super_area => $super_area->identifier,
area => $area->identifier,
location => $location->identifier,
}
);
$team->insert;
$result_set_pjs->new(
{
uuid => $uuid_pj,
owner => $uuid_owner,
full_name => $full_name,
short_name => $short_name,
nick => $nick,
race => $race->identifier,
team => $uuid_team,
experience => 126,
equipment => $uuid_equipment,
born_stats => $uuid_born_stats,
training_stats => $uuid_training_stats,
skills => $uuid_skills,
spells => $uuid_spells,
inventory => $uuid_inventory,
health => 999,
mana => 999,
}
)->insert;
$team->leader($uuid_pj);
$team->update;
}
sub _get_random_born_stat ($self) {
return int( rand(32) );
}
sub _invalid_race ($self) {
return $self->render(
status => 400,
json => { error => 'Invalid race.', }
);
}
1;