7
ImmsServer::ImmsServer()
8
: SocketServer(string(getenv("HOME")).append("/.imms/socket"))
13
string consume(list<string> &l)
18
res += l.front() + " ";
24
string getnum(list<string> &l)
27
if (size < 1 || l.size() > 2)
40
sign = l.front().substr(0, 1);
41
num = l.front().substr(1);
45
if (sign != ">" && sign != "<" && sign != "=")
48
if (!atoi(num.c_str()))
51
return sign + " '" + num + "'";
54
void ImmsServer::do_events()
60
conn = new Socket(fd);
61
*conn << "Welcome to " << PACKAGE_STRING << "\n";
62
*conn << "This feature is highly experimental, "
63
"so quit complaining" << "\n";
64
*conn << "Say 'help' if you are lost and hungry" << "\n";
67
if (conn && !conn->isok())
76
string command = conn->read();
77
command = string_tolower(string_delete(command, "\n"));
81
string predicate = "";
83
string_split(parsed, command, " ");
87
string str = parsed.front();
90
if (str == "or" || str == "and")
98
*conn << "known commands:" << "\n";
99
*conn << " show" << "\n";
100
*conn << " clear" << "\n";
101
*conn << " [or|and] artist <str>" << "\n";
102
*conn << " [or|and] rating =|>|< <int>" << "\n";
103
*conn << " [or|and] bpm =|>|< <int>" << "\n";
104
*conn << " sql <str>" << "\n";
108
if (str == "show" || str == "ls" || str == "filter")
110
*conn << "filter: " << filter << "\n";
113
if (str == "clear" || str == "reset")
116
immsdb.install_filter(filter);
120
if (str == "artist" || str == "sql" || str == "rating" || str == "bpm")
123
if (str == "artist" || str == "sql")
125
if (parsed.front() == "=")
127
params = consume(parsed);
130
params = getnum(parsed);
134
*conn << str << ": parse error" << "\n";
140
if (filter != "" && predicate == "and")
141
filter = "(" + filter + ") AND ";
142
else if (filter != "" && predicate == "or")
147
else if (str == "artist")
148
filter += "similar(Info.artist, '"
149
+ string_normalize(params) + "') ";
150
else if (str == "rating")
151
filter += "Rating.rating " + params + " ";
152
else if (str == "bpm")
153
filter += "Acoustic.bpm " + params + " ";
156
int n = immsdb.install_filter(filter);
157
*conn << itos(n) << " hits" << "\n";
161
*conn << "parse error at " << str << "\n";
166
*conn << "warning: ignored after " << parsed.front() << "\n";
169
ImmsServer::~ImmsServer()
173
unlink(string(getenv("HOME")).append("/.imms/socket").c_str());