Skip to content

Instantly share code, notes, and snippets.

@jef-sure
Created July 3, 2017 21:04
Show Gist options
  • Select an option

  • Save jef-sure/b728dc623907eaff0bdf4089dfaa508d to your computer and use it in GitHub Desktop.

Select an option

Save jef-sure/b728dc623907eaff0bdf4089dfaa508d to your computer and use it in GitHub Desktop.
sub vk_api_init {
my $self = shift;
my $token = $self->db->selectrow_hashref(
"SELECT access_token,uid FROM clients_social WHERE client_id = ? and network = ?",
{Slice => {}},
$self->current_user->{id}, 'vkontakte'
);
$self->{vk_token} = $token;
my $api_point = "https://api.vk.com/method/";
return sub {
my ($http_method, $api_method, $params) = @_;
my @form = $http_method eq 'post' && $params && %$params ? (form => $params) : ();
my $get = $http_method eq 'get' && $params && %$params ? '&' . join('&', map {"$_=$params->{$_}"} keys %$params) : '';
return $self->ua->$http_method($api_point . $api_method . "?access_token=" . $token->{access_token} . $get, @form)
->res->json;
};
}
sub avatar {
my $self = shift;
my $upload_dir = $self->app->static->paths->[0] . '/upload/avatar/';
my $vk_api = $self->vk_api_init;
if ($self->param('set_avatar')) {
my $upload = $vk_api->(get => 'photos.getProfileUploadServer');
my $uploaded = $self->ua->post($upload->{response}{upload_url},
form => {photo => {file => $upload_dir . $self->param('set_avatar')}})->res->json;
my $set = $vk_api->(
post => 'photos.saveProfilePhoto',
{ hash => $uploaded->{hash},
photo => $uploaded->{photo},
server => $uploaded->{server},
}
);
$self->session('avatar' => '/upload/avatar/' . $self->param('set_avatar'));
$self->session('photo_hash' => $set->{response}{photo_hash});
$self->redirect_to('https://vk.com/app6098634');
}
my $data = $vk_api->(
get => 'users.get',
{uids => $self->{vk_token}{uid}, fields => 'photo_max_orig'}
);
my $user_image = Mojo::File->new($data->{response}[0]{photo_max_orig});
unless (-e $upload_dir . $user_image->basename) {
$self->ua->max_redirects(5)->get($data->{response}[0]{photo_max_orig})
->result->content->asset->move_to($upload_dir . $user_image->basename);
}
use Image::Magick;
my @mask = ('avatar1', 'avatar2');
my @images;
for my $mask (@mask) {
my $image = new Image::Magick;
$image->Read($upload_dir . $user_image->basename);
my $mark_up = Image::Magick->new;
$mark_up->Read($upload_dir . 'mask/' . $mask . '_up.png');
$mark_up->Resize(geometry => '400x400!');
$image->Composite(image => $mark_up, qw(compose SrcAtop gravity North));
my $mark_down = Image::Magick->new;
$mark_down->Read($upload_dir . 'mask/' . $mask . '_bottom.png');
$mark_down->Resize(geometry => '400x400!');
$image->Composite(image => $mark_down, qw(compose SrcAtop gravity South));
my $avatar = Mojo::File->new($upload_dir . md5_sum($user_image->basename . $mask) . '.jpg');
my $x = $image->Write($avatar->path);
warn "$x" if "$x";
push @images, $avatar->basename;
}
return $self->respond_to(
html => {
template => 'user/avatar',
images => \@images,
},
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment