Henrybk

Profilechanger v2

Mar 16th, 2016
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.64 KB | None | 0 0
  1. package profileChanger;
  2.  
  3. use strict;
  4. use File::Spec;
  5. use Plugins;
  6. use Globals qw($interface $quit);
  7. use Log qw(debug message warning error);
  8. use Settings;
  9. use Misc;
  10.  
  11. return unless
  12. Plugins::register('profileChanger', 'profileChanger', \&on_unload);
  13.  
  14. my $chooks = Commands::register(
  15.     ['changeProfile', "Changes profile", \&commandHandler]
  16. );
  17.  
  18. sub on_unload {
  19.     Commands::unregister($chooks);
  20. }
  21.  
  22. sub commandHandler {
  23.     my (undef, $new_profile) = @_;
  24.    
  25.     if (!$profiles::profile) {
  26.         error "[PC] Profiles plugin not loaded\n";
  27.         return;
  28.     }
  29.    
  30.     opendir my $d, $profiles::profile_folder;
  31.     my @conlist = readdir($d);
  32.     closedir $d;
  33.    
  34.     if (!$new_profile) {
  35.  
  36.         my @profiles;
  37.  
  38.         foreach (@conlist) {
  39.             next unless -d File::Spec->catdir($profiles::profile_folder, $_);
  40.             next if ($_ =~ /^\./);
  41.             push @profiles, $_;
  42.         }
  43.  
  44.         @profiles = sort { $a cmp $b } @profiles;
  45.  
  46.         if (@profiles) {
  47.             my $choice = $interface->showMenu(  #
  48.                 "Please choose a Profiles folder.",
  49.                 \@profiles,
  50.                 title => "Profiles Selector"
  51.             );
  52.  
  53.             return $quit = 1 if $choice == -1;
  54.  
  55.             $new_profile = $profiles[$choice];
  56.         } else {
  57.             error "[PC] There are no profiles in profiles folder\n";
  58.             return;
  59.         }
  60.     } else {
  61.         my $found = 0;
  62.         foreach (@conlist) {
  63.             next unless -d File::Spec->catdir($profiles::profile_folder, $_);
  64.             next if ($_ =~ /^\./);
  65.             $found = 1 if ($new_profile eq $_);
  66.         }
  67.         error "[PC] Provided profile not found in profiles folder\n";
  68.         undef $found;
  69.     }
  70.    
  71.     my $new_profile_folder = File::Spec->catdir($profiles::profile_folder, $new_profile);
  72.     my %reloadFiles;
  73.    
  74.     message "[PC] Looking for loaded files in old profile '".$profiles::profile."' to unload \n", "system";
  75.     foreach my $file (@{$Settings::files->getItems}) {
  76.         next if ($file->{'type'} != 0);
  77.         my $filepath;
  78.         if ($file->{'autoSearch'} == 1) {
  79.             $filepath = Settings::_findFileFromFolders($file->{'name'}, \@Settings::controlFolders);
  80.         } else {
  81.             $filepath = $file->{'name'};
  82.         }
  83.         my (undef,$directories,$filename) = File::Spec->splitpath($filepath);
  84.         my @dirs = File::Spec->splitdir($directories);
  85.        
  86.         if ($dirs[-2] eq $profiles::profile) {
  87.             message "[PC] Unloading '".$filename."' from '".$profiles::profile."'\n";
  88.             $reloadFiles{$file->{'index'}} = $filename;
  89.         }
  90.     }
  91.    
  92.     opendir my $d, $new_profile_folder;
  93.     my @newProfileFiles = readdir($d);
  94.     closedir $d;
  95.  
  96.     message "[PC] Looking for files in new profile '".$new_profile."'\n", "system";
  97.     foreach my $filename (@newProfileFiles) {
  98.         next unless -f File::Spec->catdir($new_profile_folder, $filename);
  99.         next if ($filename =~ /^\./);
  100.         foreach my $file (@{$Settings::files->getItems}) {
  101.             next if ($file->{'type'} != 0);
  102.             next if (exists $reloadFiles{$file->{'index'}});
  103.             my $name = $file->{'autoSearch'} == 1 ? $file->{'name'} : $file->{'internalName'};
  104.             if ($name eq $filename) {
  105.                 $reloadFiles{$file->{'index'}} = $filename;
  106.                 message "[PC] Unloading '".$filename."' from base control folder\n";
  107.             }
  108.         }
  109.     }
  110.    
  111.     shift @Settings::controlFolders;
  112.     unshift @Settings::controlFolders, $new_profile_folder;
  113.  
  114.     my $progressHandler = sub {
  115.         my ($filename) = @_;
  116.         message "[PC] Loading ".$filename."...\n";
  117.     };
  118.    
  119.     message "[PC] Loading files\n", "system";
  120.     foreach my $file_index (keys %reloadFiles) {
  121.         my $file = $Settings::files->get($file_index);
  122.         if ($file->{'autoSearch'} == 0) {
  123.             $file->{'name'} = Settings::_findFileFromFolders($file->{'internalName'}, \@Settings::controlFolders);
  124.         }
  125.         Settings::loadByHandle($file_index, $progressHandler);
  126.     }
  127.     message "[PC] Loading over, profile '".$new_profile."' loaded\n", "system";
  128.     $profiles::profile = $new_profile;
  129. }
  130.  
  131. return 1;
Advertisement
Add Comment
Please, Sign In to add comment