This commit is contained in:
end-4
2024-02-22 15:35:06 +07:00
commit 8db26e9707
4220 changed files with 208544 additions and 0 deletions
+203
View File
@@ -0,0 +1,203 @@
#include <array>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
#include "nlohmann/json.hpp"
using namespace std;
using json = nlohmann::json;
string searchTerm;
string results;
vector<string> entryNames;
json appEntries;
bool updateInfo = false;
void splitString(const std::string& str, const char delimiter,
std::vector<std::string>& result) {
std::string line;
std::istringstream stream(str);
while (std::getline(stream, line)) {
if (!line.empty()) {
if (line.back() == delimiter) {
line.pop_back();
}
result.push_back(line);
}
}
}
string exec(const char* cmd) {
array<char, 128> buffer;
string result;
unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
if (!pipe) {
throw runtime_error("popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += buffer.data();
}
return result;
}
bool likelyNotMath(const string& expression) {
char firstChar = expression[0];
if (firstChar >= '0' && firstChar <= '9') return false;
return true;
}
void calcPrompt() {
cout << "[{\"name\":\"Calculator - Type "
"something!\",\"icon\":\"images/svg/dark/"
"calculator.svg\",\"exec\":\"wl-copy \\\"Clipboard contents "
";)\\\"\"}]";
exec(
"eww update winsearch_actions='{\"name\":\"Calculator - Type "
"something!\",\"icon\":\"images/svg/dark/"
"calculator.svg\",\"exec\":\"wl-copy \\\"Clipboard contents "
";)\\\"\"}' &");
exec("eww update winsearch_actions_type='Math result' &");
exit(0);
}
void getAppNames() {
string searchCommand =
"cat 'scripts/cache/entrynames.txt' | fzf --filter=\"" + searchTerm +
"\" | head -n 10";
string results = exec(&searchCommand[0]);
splitString(results, '\n', entryNames);
}
void getAppJson() {
ifstream file("scripts/cache/entries.txt");
file >> appEntries;
}
void tryThemeCmd() {
if (searchTerm.size() >= 6)
searchTerm = searchTerm.substr(6);
else
searchTerm = " ";
string searchCommand =
"ls css/savedcolors/ | grep .txt | sed 's/_iconcolor_//g' | sed "
"'s/.txt//g' | fzf --filter='" +
searchTerm + "'";
string results = exec(&searchCommand[0]);
splitString(results, '\n', entryNames);
cout << '[';
for (int i = 0; i < entryNames.size(); i++) {
string entryName = entryNames[i];
cout << '{';
cout << "\"name\":\"" << entryName << "\",\"exec\":\">load "
<< entryName << "\"";
cout << '}';
if (i < entryNames.size() - 1) cout << ',';
}
cout << ']' << endl;
if (updateInfo) {
string entryName = entryNames[0];
string updateCmd = "eww update winsearch_actions='{\"name\":\"" +
entryName + "\",\"exec\":\">load " + entryName +
"\"}'";
exec(&updateCmd[0]);
exec("eww update winsearch_actions_type='Color theme'");
}
exit(0);
}
void tryAppSearch() {
if (entryNames.size() == 0) return; // No app found, skip it
cout << '[';
for (int i = 0; i < entryNames.size(); i++) {
string entryName = entryNames[i];
cout << appEntries[entryName];
if (i < entryNames.size() - 1) cout << ',';
}
cout << ']' << endl;
if (updateInfo) {
string updateCmd = "eww update winsearch_actions='" +
string(appEntries[entryNames[0]].dump()) + "'";
exec(&updateCmd[0]);
exec("eww update winsearch_actions_type='Application'");
}
exit(0);
}
void tryCalculate() {
if (likelyNotMath(searchTerm)) return;
string calcCommand = "qalc '" + searchTerm + "'";
string results = exec(&calcCommand[0]);
results = results.substr(results.find_first_of("=") + 2);
if(results.back() == '\n') results.pop_back();
// cout << results << '\n';
cout
<< "[{\"name\":\"" << results
<< "\",\"icon\":\"images/svg/dark/calculator.svg\",\"exec\":\"wl-copy '"
<< results << "'\"}]" << endl;
if (updateInfo) {
string updateCmd =
"eww update "
"winsearch_actions='{\"name\":\"'\"" +
results +
"\"'\",\"icon\":\"images/svg/dark/"
"calculator.svg\",\"exec\":\"wl-copy '" +
results + "'\"}'";
exec(&updateCmd[0]);
exec("eww update winsearch_actions_type='Math result'");
}
exit(0);
}
void commandOnly() {
cout << "[]" << endl;
if (updateInfo) {
string updateCmd =
"eww update "
"winsearch_actions='{\"name\":\"'\"" +
searchTerm +
"\"'\",\"icon\":\"images/svg/dark/"
"protocol.svg\",\"exec\":\"" +
searchTerm + "\"}'";
exec(&updateCmd[0]);
exec("eww update winsearch_actions_type='Run command'");
}
exit(0);
}
int main(int argc, char* argv[]) {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Arguments
if (argc == 1) {
cout << "[{\"name\": \"Type something!\"}]";
return 0;
}
if (argc > 2 && string(argv[2]) == "--updateinfo") updateInfo = true;
searchTerm = argv[1];
// Special commands
if (searchTerm == "--calculator") calcPrompt();
if (searchTerm[0] == '>') {
if (searchTerm.find(">load") != string::npos)
tryThemeCmd();
else {
cout << "[]" << endl;
exit(0);
}
}
// Get app names and entries
getAppNames();
getAppJson();
// Attempt searches in order. Each search will exit if success
tryCalculate();
tryAppSearch();
commandOnly();
cout << results;
}