Advertisement
Guest User

osu! Cleaner

a guest
Dec 7th, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <string>
  5. #include <float.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <dirent.h>
  9. #include <cstring>
  10. #include <windows.h>
  11. using namespace std;
  12.  
  13. string strtolower(string str)
  14. {
  15.     for(unsigned int i = 0; i < str.size(); i++)
  16.         str[i]=tolower(str[i]);
  17.     return str;
  18. }
  19.  
  20. char tolower(char ch)
  21. {
  22.     if(ch < 91 && ch > 64)
  23.         return ch + 32;
  24.     return ch;
  25. }
  26.  
  27. long fileLength (const char * name)
  28. {
  29.     ifstream file (name, ios::in|ios::binary);
  30.     file.seekg (0, ios::end);
  31.     return file.tellg();
  32. }
  33.  
  34. vector<string> detectedfiles;
  35.  
  36. string getFileExtension(const string filename)
  37. {
  38.     unsigned int i = filename.size();
  39.     while(i != 0 && filename[i] != '.')
  40.         i--;
  41.  
  42.     if(i == 0) return " ";
  43.  
  44.     return filename.substr(i + 1, filename.size() - 1);
  45. }
  46.  
  47. bool isValidName(string name)
  48. {
  49.     string ext = getFileExtension(name);
  50.     if(ext != "png" && ext != "jpg")
  51.         return false;
  52.  
  53.     name = strtolower(name.substr(0, name.size() - 4));
  54.  
  55.     for(unsigned int i=0;i<detectedfiles.size();i++)
  56.         if(name==detectedfiles[i]) return true;
  57.  
  58.     return false;
  59. }
  60.  
  61. bool isValidExt(string ext)
  62. {
  63.     if(ext == "avi" ||ext == "mp4")
  64.         return true;
  65.  
  66.     return false;
  67. }
  68.  
  69. bool loadFile()
  70. {
  71.     ifstream file("detectedfiles.ini");
  72.     if(file)
  73.     {
  74.         string line;
  75.         while(getline(file, line)){
  76.             detectedfiles.push_back(strtolower(line));
  77.         }
  78.         return true;
  79.     }
  80.     return false;
  81. }
  82.  
  83. bool dirExists(const std::string& dirName_in)
  84. {
  85.   DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
  86.   if (ftyp == INVALID_FILE_ATTRIBUTES)
  87.     return false;  //something is wrong with your path!
  88.  
  89.   if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
  90.     return true;   // this is a directory!
  91.  
  92.   return false;    // this is not a directory!
  93. }
  94.  
  95. string GetOsuPath()
  96. {
  97.     ifstream file("osupaths.ini");
  98.     if(file)
  99.     {
  100.         string line;
  101.         while(getline(file, line)){
  102.             if(dirExists(line))
  103.                 return line;
  104.         }
  105.     }
  106.     return " ";
  107. }
  108.  
  109. vector<string> explode( const string &delimiter, const string &str)
  110. {
  111.     vector<string> arr;
  112.  
  113.     int strleng = str.length();
  114.     int delleng = delimiter.length();
  115.     if (delleng==0)
  116.         return arr;//no change
  117.  
  118.     int i=0;
  119.     int k=0;
  120.     while( i<strleng )
  121.     {
  122.         int j=0;
  123.         while (i+j<strleng && j<delleng && str[i+j]==delimiter[j])
  124.             j++;
  125.         if (j==delleng)//found delimiter
  126.         {
  127.             arr.push_back(  str.substr(k, i-k) );
  128.             i+=delleng;
  129.             k=i;
  130.         }
  131.         else
  132.         {
  133.             i++;
  134.         }
  135.     }
  136.     arr.push_back(  str.substr(k, i-k) );
  137.     return arr;
  138. }
  139.  
  140. vector<string> getMaps(char* path, bool printornot)
  141. {
  142.     vector<string> mapvec;
  143.  
  144.     DIR *dir;
  145.     struct dirent *ent;
  146.     if((dir = opendir (path)) != NULL)
  147.     {
  148.         while((ent = readdir (dir)) != NULL)
  149.         {
  150.             if(ent->d_name[0] == '.')
  151.                 continue;
  152.  
  153.             char patha[256];
  154.             sprintf(patha, "%s%s\\", path, ent->d_name);
  155.             mapvec.push_back(patha);
  156.             if(printornot) cout << ent->d_name << endl;
  157.         }
  158.         closedir(dir);
  159.         if(printornot) cout << endl << mapvec.size() << " maps trouvees" << endl;
  160.     }
  161.     return mapvec;
  162. }
  163.  
  164. int main()
  165. {
  166.     if(!loadFile()){
  167.         cout << "Erreur: impossible de charger la liste des fichiers a supprimer";
  168.         return 0;
  169.     }
  170.  
  171.     char osupath[256];
  172.     string path = GetOsuPath(), line = "";
  173.     if(path == " "){
  174.         char* temp = getenv("APPDATA");
  175.         sprintf(osupath, "%s\\..\\Local\\osu!\\Songs\\", temp);
  176.         if(!dirExists(string(osupath))){
  177.             cout << "Erreur: impossible de charger le chemin de votre osu!, entrez-le manuellement dans le fichier osupaths.ini";
  178.             return 0;
  179.         }
  180.     }
  181.     else{
  182.         strcpy(osupath, path.c_str());
  183.         sprintf(osupath, "%sSongs\\", osupath);
  184.     }
  185.  
  186.     vector<char*> mapfolders;
  187.     bool printforwait = true;
  188.  
  189.     cout << "osu!Cleaner par Kiloutre\nTapez !commands pour voir la liste des commandes\n";
  190.  
  191.     while(1)
  192.     {
  193.         getline(cin, line);
  194.         vector<string> result=explode(" ", strtolower(line));
  195.         if(result[0] == "!commands"){
  196.                 cout << "\n----- COMMANDES -----\n!clean [SKINS/VIDEO/ALL] - Permet de supprimer tous les skins ou video des beatmaps\n!exit - Arreter le programme\n\n";
  197.                 continue;
  198.         }
  199.  
  200.         if(result[0] == "!exit")
  201.             return 1;
  202.  
  203.         if(result[0] == "!clean")
  204.         {
  205.             if(result.size() == 1){
  206.                 cout << "\nUsage: !clean [SKIN/VIDEO/ALL]" << endl;
  207.                 continue;
  208.             }
  209.  
  210.             if(result[1] == strtolower("skin")){
  211.                 vector<string> mapfolders;
  212.                 mapfolders = getMaps(osupath, printforwait);
  213.                 cout << "\nEtes-vous certain de vouloir supprimer les fichiers de skins inclus dans vos beatmaps ?\n";
  214.                 system("pause");
  215.  
  216.                 unsigned int deletednumber = 0;
  217.                 float deletedsize = 0;
  218.  
  219.                 unsigned int msize = mapfolders.size() - 1;
  220.                 for(unsigned int i = 0; i < msize; i++)
  221.                 {
  222.                     cout << i << " sur " << msize - 1 << " / " << deletednumber << " fichiers et " << (deletedsize/1000)/1000 << " MO supprimes" << endl;
  223.                     char path[256];
  224.                     strcpy(path, mapfolders[i].c_str());
  225.  
  226.                     DIR *dir;
  227.                     struct dirent *ent;
  228.                     if((dir = opendir (path)) != NULL)
  229.                     {
  230.                         while((ent = readdir (dir)) != NULL)
  231.                         {
  232.                             if(ent->d_name[0] == '.')
  233.                                 continue;
  234.  
  235.                             if(isValidName(ent->d_name))
  236.                             {
  237.                                 char filename[256];
  238.                                 sprintf(filename, "%s%s", path, ent->d_name);
  239.                                 float filesize = (float)fileLength(filename);
  240.  
  241.                                 if(!remove(filename)){
  242.                                     deletedsize+=filesize;
  243.                                     deletednumber++;
  244.                                 }
  245.                             }
  246.                         }
  247.                         closedir(dir);
  248.                     }
  249.  
  250.                 }
  251.                 cout << "\n\nNettoyage termine. " << deletednumber << " fichiers ont ete supprimes, " << (deletedsize/1000)/1000 << " MO on ete liberes." << endl;
  252.                 continue;
  253.             }
  254.  
  255.             if(result[1] == strtolower("video")){
  256.                 vector<string> mapfolders;
  257.                 mapfolders = getMaps(osupath, printforwait);
  258.                 cout << "\nEtes-vous certain de vouloir supprimer les videos inclues dans vos beatmaps ?\n";
  259.                 system("pause");
  260.  
  261.                 unsigned int deletednumber = 0;
  262.                 float deletedsize = 0;
  263.  
  264.                 unsigned int msize = mapfolders.size() - 1;
  265.                 for(unsigned int i = 0; i < msize; i++)
  266.                 {
  267.                     cout << i << " sur " << msize - 1 << " / " << deletednumber << " fichiers et " << (deletedsize/1000)/1000 << " MO supprimes" << endl;
  268.                     char path[256];
  269.                     strcpy(path, mapfolders[i].c_str());
  270.  
  271.                     DIR *dir;
  272.                     struct dirent *ent;
  273.                     if((dir = opendir (path)) != NULL)
  274.                     {
  275.                         while((ent = readdir (dir)) != NULL)
  276.                         {
  277.                             if(ent->d_name[0] == '.')
  278.                                 continue;
  279.  
  280.                             if(isValidExt(getFileExtension(ent->d_name)))
  281.                             {
  282.                                 char filename[256];
  283.                                 sprintf(filename, "%s%s", path, ent->d_name);
  284.                                 float filesize = (float)fileLength(filename);
  285.  
  286.                                 if(!remove(filename)){
  287.                                     deletedsize+=filesize;
  288.                                     deletednumber++;
  289.                                 }
  290.                             }
  291.                         }
  292.                         closedir(dir);
  293.                     }
  294.  
  295.                 }
  296.  
  297.                 cout << "\n\nNettoyage termine. " << deletednumber << " fichiers ont ete supprimes, " << (deletedsize/1000)/1000 << " MO on ete liberes." << endl;
  298.                 continue;
  299.             }
  300.  
  301.             if(result[1] == strtolower("all")){
  302.                 vector<string> mapfolders;
  303.                 mapfolders = getMaps(osupath, printforwait);
  304.                 cout << "\nEtes-vous certain de vouloir supprimer les fichiers de skins et videos inclus dans vos beatmaps ?\n";
  305.                 system("pause");
  306.  
  307.                 unsigned int deletednumber = 0;
  308.                 float deletedsize = 0;
  309.  
  310.                 unsigned int msize = mapfolders.size() - 1;
  311.                 for(unsigned int i = 0; i < msize; i++)
  312.                 {
  313.                     cout << i << " sur " << msize - 1 << " / " << deletednumber << " fichiers et " << (deletedsize/1000)/1000 << " MO supprimes" << endl;
  314.                     char path[256];
  315.                     strcpy(path, mapfolders[i].c_str());
  316.  
  317.                     DIR *dir;
  318.                     struct dirent *ent;
  319.                     if((dir = opendir (path)) != NULL)
  320.                     {
  321.                         while((ent = readdir (dir)) != NULL)
  322.                         {
  323.                             if(ent->d_name[0] == '.')
  324.                                 continue;
  325.  
  326.                             if(isValidName(ent->d_name) || isValidExt(getFileExtension(ent->d_name)))
  327.                             {
  328.                                 char filename[256];
  329.                                 sprintf(filename, "%s%s", path, ent->d_name);
  330.                                 float filesize = (float)fileLength(filename);
  331.  
  332.                                 if(!remove(filename)){
  333.                                     deletedsize+=filesize;
  334.                                     deletednumber++;
  335.                                 }
  336.                             }
  337.                         }
  338.                         closedir(dir);
  339.                     }
  340.  
  341.                 }
  342.                 cout << "\n\nNettoyage termine. " << deletednumber << " fichiers ont ete supprimes, " << (deletedsize/1000)/1000 << " MO on ete liberes." << endl;
  343.                 continue;
  344.             }
  345.  
  346.             cout << "\nUsage: !clean [SKIN/VIDEO/ALL]" << endl;
  347.             continue;
  348.         }
  349.  
  350.         cout << "Commande inconnue ! Tapez !commands pour voir la liste des commandes\n";
  351.     }
  352.  
  353.     return 0;
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement