82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | #include <fstream>
 | ||
|  | #include <query/Command.h>
 | ||
|  | #include <cstring>
 | ||
|  | #include <utility>
 | ||
|  | 
 | ||
|  | #include <functional> /* required from permission manager */
 | ||
|  | #include "log/LogUtils.h"
 | ||
|  | #include "Definitions.h"
 | ||
|  | #include "PermissionManager.h"
 | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | using namespace ts; | ||
|  | 
 | ||
|  | /* Took from the permission mapper within the TeaSpeakServer */ | ||
|  | enum PermissionMapGroup { | ||
|  | 	MIN, | ||
|  | 	TS3 = MIN, | ||
|  | 	TEAWEB, | ||
|  | 	TEACLIENT, | ||
|  | 	QUERY, | ||
|  | 	MAX | ||
|  | }; | ||
|  | 
 | ||
|  | std::map<PermissionMapGroup, string> group_names = { | ||
|  | 		{PermissionMapGroup::TS3, "TeamSpeak 3"}, | ||
|  | 		{PermissionMapGroup::TEAWEB, "TeaSpeak-Web"}, | ||
|  | 		{PermissionMapGroup::TEACLIENT, "TeaSpeak-Client"}, | ||
|  | 		{PermissionMapGroup::QUERY, "Query"} | ||
|  | }; | ||
|  | 
 | ||
|  | //TODO: Does it work with a space at the end?
 | ||
|  | #define I "\x5f\xcc\xb2" /* an underscore with an non-spacing underscore */
 | ||
|  | std::map<string, string> replacements = { | ||
|  | 		{"_music", I "music"}, | ||
|  | 		{"_hwid", I "hwid" }, | ||
|  | 		{"_playlist", I "playlist"} | ||
|  | }; | ||
|  | 
 | ||
|  | std::string replace_all(std::string str, const std::string& from, const std::string& to) { | ||
|  | 	size_t start_pos = 0; | ||
|  | 	while((start_pos = str.find(from, start_pos)) != std::string::npos) { | ||
|  | 		str.replace(start_pos, from.length(), to); | ||
|  | 		start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
 | ||
|  | 	} | ||
|  | 	return str; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | int main(int argc, char** argv) { | ||
|  | 	ofstream of("permission_mapping.txt"); | ||
|  | 
 | ||
|  | 	of << "# This is a auto generated template file!" << endl; | ||
|  | 	of << "# DO NOT EDIT IF YOU'RE NOT SURE WHAT YOU'RE DOING!" << endl; | ||
|  | 	of << "# Syntax:" << endl; | ||
|  | 	of << "# group:<group id> -> group id values: 0 := TS3 | 1 := TeaWeb | 2 := TeaClient | 3 := Query " << endl; | ||
|  | 	of << "# mapping:<original name>:<mapped value>" << endl; | ||
|  | 	of << "# Note: Be aware of spaces and line endings. The TeaSpeakServer does not trim the values!" << endl; | ||
|  | 	of << "#" << endl; | ||
|  | 
 | ||
|  | 
 | ||
|  | 	for(PermissionMapGroup type = PermissionMapGroup::MIN; type < PermissionMapGroup::MAX; (*(int*) &type)++) { | ||
|  | 		of << "# Begin mapping for group " << (int) type << " (" << group_names[type] << ")" << endl; | ||
|  | 		of << "group:" << (int) type << endl; | ||
|  | 
 | ||
|  | 		if(type == PermissionMapGroup::TS3) { | ||
|  | 			for(const auto& permission : permission::availablePermissions) { | ||
|  | 				if(!permission->clientSupported) | ||
|  | 					continue; | ||
|  | 
 | ||
|  | 				auto value = permission->name; | ||
|  | 				for(auto& replacement : replacements) | ||
|  | 					value = replace_all(value, replacement.first, replacement.second); | ||
|  | 				of << "mapping:" << permission->name << ":" << value << endl; | ||
|  | 			} | ||
|  | 		} else { | ||
|  | 			of << "#  No mapping required here. You're of course free to add stuff here." << endl; | ||
|  | 		} | ||
|  | 		of << "# End mapping of group" << endl; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	of.close(); | ||
|  | } |