|
@@ -7,7 +7,7 @@ namespace Riddle {
|
|
public const int REGISTRATION_TIMEOUT_US = 600000000;
|
|
public const int REGISTRATION_TIMEOUT_US = 600000000;
|
|
private SocketService service;
|
|
private SocketService service;
|
|
private Gee.HashMap<string, Invercargill.Sequence<Registration>> registrations = new Gee.HashMap<string, Invercargill.Sequence<Registration>>();
|
|
private Gee.HashMap<string, Invercargill.Sequence<Registration>> registrations = new Gee.HashMap<string, Invercargill.Sequence<Registration>>();
|
|
- private Gee.HashMap<string, Invercargill.Sequence<RiddleEnvelope>> riddles = new Gee.HashMap<string, Invercargill.Sequence<RiddleEnvelope>>();
|
|
|
|
|
|
+ private Gee.HashMap<string, RiddleEnvelope> riddles = new Gee.HashMap<string, RiddleEnvelope>();
|
|
private Gee.HashMap<string, NameInfo> names = new Gee.HashMap<string, NameInfo>();
|
|
private Gee.HashMap<string, NameInfo> names = new Gee.HashMap<string, NameInfo>();
|
|
|
|
|
|
|
|
|
|
@@ -61,7 +61,9 @@ namespace Riddle {
|
|
case MessageType.WHO_IS:
|
|
case MessageType.WHO_IS:
|
|
return handle_who_is(msg);
|
|
return handle_who_is(msg);
|
|
case MessageType.RIDDLE:
|
|
case MessageType.RIDDLE:
|
|
- return handle_riddle(msg);
|
|
|
|
|
|
+ return handle_riddle(msg, origin);
|
|
|
|
+ case MessageType.CALLBACK:
|
|
|
|
+ return handle_callback(msg);
|
|
default:
|
|
default:
|
|
return new Message(MessageType.ERROR, new string[] { "unknown-command" }, new string[0]);
|
|
return new Message(MessageType.ERROR, new string[] { "unknown-command" }, new string[0]);
|
|
}
|
|
}
|
|
@@ -137,24 +139,43 @@ namespace Riddle {
|
|
return new Message(MessageType.ANSWER, new string[0], new string[] { name.get_encoded() });
|
|
return new Message(MessageType.ANSWER, new string[0], new string[] { name.get_encoded() });
|
|
}
|
|
}
|
|
|
|
|
|
- private Message handle_riddle(Message msg) throws Error {
|
|
|
|
- var group_id = msg.arguments[0];
|
|
|
|
- var riddles_to_try = Invercargill.empty<Riddle>();
|
|
|
|
|
|
+ private Message handle_riddle(Message msg, InetSocketAddress origin) throws Error {
|
|
|
|
+ var riddle_envelope = new RiddleEnvelope.from_message(msg, origin.address);
|
|
|
|
+ if(!riddle_envelope.validate_identifier()) {
|
|
|
|
+ return new Message(MessageType.NOT_ACCEPTED, new string[] { "100", "invalid-identifier" }, new string[0]);
|
|
|
|
+ }
|
|
|
|
+
|
|
lock(riddles) {
|
|
lock(riddles) {
|
|
- if(!riddles.has_key(group_id)) {
|
|
|
|
- return new Message(MessageType.UNKNOWN, new string[0], new string[0]);
|
|
|
|
|
|
+ if(riddles.has_key(riddle_envelope.identifier)) {
|
|
|
|
+ return new Message(MessageType.NOT_ACCEPTED, new string[] { "104", "already-received" }, new string[0]);
|
|
}
|
|
}
|
|
- riddles_to_try = riddles[group_id].to_sequence();
|
|
|
|
|
|
+ riddles.set(riddle_envelope.identifier, riddle_envelope);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Forward riddle on here
|
|
|
|
+ // Pass to application to solve then compact when done.
|
|
|
|
+
|
|
|
|
+ return new Message(MessageType.OK, new string[0], new string[0]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Message handle_callback(Message msg) throws Error {
|
|
|
|
+ var solution_envelope = new SolutionEnvelope.from_message(msg);
|
|
|
|
+ var riddle_metadata = get_riddle_metadata(solution_envelope.identifier);
|
|
|
|
+ if(riddle_metadata == null) {
|
|
|
|
+ return new Message(MessageType.NOT_ACCEPTED, new string[] { "105", "riddle-not-found" }, new string[0]);
|
|
}
|
|
}
|
|
|
|
|
|
- var challenges = ate(msg.items).select<Challenge>(item => new Challenge.from_string(item));
|
|
|
|
- var answers = challenges.select<Answer?>(c => riddles_to_try.select<Answer?>(r => r.answer_challenge(c)).first_or_default(a => a != null));
|
|
|
|
|
|
+ if(!solution_envelope.verify(riddle_metadata.solution_verification_key)) {
|
|
|
|
+ return new Message(MessageType.NOT_ACCEPTED, new string[] { "101", "verification-failed" }, new string[0]);
|
|
|
|
+ }
|
|
|
|
|
|
- var answer = answers.first_or_default();
|
|
|
|
- if(answer == null) {
|
|
|
|
- return new Message(MessageType.UNKNOWN, new string[0], new string[0]);
|
|
|
|
|
|
+ if(riddle_metadata.reply_address == null) {
|
|
|
|
+ // TODO Verify with Riddle Object
|
|
|
|
+ return new Message(MessageType.ERROR, new string[] { "not-implemented" }, new string[0]);
|
|
}
|
|
}
|
|
- return new Message(MessageType.ANSWER, answer.to_arguments(), new string[0]);
|
|
|
|
|
|
+
|
|
|
|
+ // TODO Forward to reply address
|
|
|
|
+ return new Message(MessageType.ERROR, new string[] { "not-implemented" }, new string[0]);
|
|
}
|
|
}
|
|
|
|
|
|
private void cleanup_registrations() {
|
|
private void cleanup_registrations() {
|
|
@@ -222,6 +243,15 @@ namespace Riddle {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private RiddleEnvelope? get_riddle_metadata(string identifier) {
|
|
|
|
+ lock(riddles) {
|
|
|
|
+ if(riddles.has_key(identifier)) {
|
|
|
|
+ return riddles[identifier];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
private class Registration {
|
|
private class Registration {
|