static int c_disable(struct conn *c, char **vec, int nvec) {
if(nvec == 0)
- disable_playing(c->who);
+ disable_playing(c->who, c->ev);
else if(nvec == 1 && !strcmp(vec[0], "now"))
- disable_playing(c->who);
+ disable_playing(c->who, c->ev);
else {
sink_writes(ev_writer_sink(c->w), "550 invalid argument\n");
return 1; /* completed */
if((l = trackdb_get(playing->track, "_length"))
&& (length = atol(l))) {
xtime(&when);
- when += length - playing->sofar + config->gap;
+ when += length - playing->sofar;
}
} else
/* Nothing is playing but playing is enabled, so whatever is
if(when) {
if((l = trackdb_get(q->track, "_length"))
&& (length = atol(l)))
- when += length + config->gap;
+ when += length;
else
when = 0;
}
static int c_random_disable(struct conn *c,
char attribute((unused)) **vec,
int attribute((unused)) nvec) {
- disable_random(c->who);
+ disable_random(c->who, c->ev);
sink_writes(ev_writer_sink(c->w), "250 OK\n");
return 1; /* completed */
}
sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n");
return 1;
}
- trackdb_set_global(vec[0], vec[1], c->who);
- sink_printf(ev_writer_sink(c->w), "250 OK\n");
+ /* We special-case the 'magic' preferences here. */
+ if(!strcmp(vec[0], "playing")) {
+ (flag_enabled(vec[1]) ? enable_playing : disable_playing)(c->who, c->ev);
+ sink_printf(ev_writer_sink(c->w), "250 OK\n");
+ } else if(!strcmp(vec[0], "random-play")) {
+ (flag_enabled(vec[1]) ? enable_random : disable_random)(c->who, c->ev);
+ sink_printf(ev_writer_sink(c->w), "250 OK\n");
+ } else {
+ if(!trackdb_set_global(vec[0], vec[1], c->who))
+ sink_printf(ev_writer_sink(c->w), "250 OK\n");
+ else
+ sink_writes(ev_writer_sink(c->w), "550 not found\n");
+ }
return 1;
}
return 1;
}
-static const struct command {
+/** @brief Server's definition of a command */
+static const struct server_command {
/** @brief Command name */
const char *name;
*/
rights_type rights;
} commands[] = {
- { "adduser", 2, 3, c_adduser, RIGHT_ADMIN|RIGHT__LOCAL },
+ { "adduser", 2, 3, c_adduser, RIGHT_ADMIN },
{ "adopt", 1, 1, c_adopt, RIGHT_PLAY },
{ "allfiles", 0, 2, c_allfiles, RIGHT_READ },
{ "confirm", 1, 1, c_confirm, 0 },
{ "cookie", 1, 1, c_cookie, 0 },
- { "deluser", 1, 1, c_deluser, RIGHT_ADMIN|RIGHT__LOCAL },
+ { "deluser", 1, 1, c_deluser, RIGHT_ADMIN },
{ "dirs", 0, 2, c_dirs, RIGHT_READ },
{ "disable", 0, 1, c_disable, RIGHT_GLOBAL_PREFS },
{ "edituser", 3, 3, c_edituser, RIGHT_ADMIN|RIGHT_USERINFO },
{ "random-enabled", 0, 0, c_random_enabled, RIGHT_READ },
{ "recent", 0, 0, c_recent, RIGHT_READ },
{ "reconfigure", 0, 0, c_reconfigure, RIGHT_ADMIN },
- { "register", 3, 3, c_register, RIGHT_REGISTER|RIGHT__LOCAL },
+ { "register", 3, 3, c_register, RIGHT_REGISTER },
{ "reminder", 1, 1, c_reminder, RIGHT__LOCAL },
{ "remove", 1, 1, c_remove, RIGHT_REMOVE__MASK },
{ "rescan", 0, INT_MAX, c_rescan, RIGHT_RESCAN },