/// <summary> /// Creates a canvas /// </summary> /// <param name="id"></param> /// <returns></returns> private async Task <bool> InternalGetCanvas(ObjectId id) { //Load from the database DbCanvas data = await Program.conn.LoadCanvasData(id); if (data == null) { return(false); } //Set data saved_users_index = data.user_index; users = data.users; last_edit = data.last_edited; last_editor = data.last_editor; //Load data from disk if (File.Exists(GetSavePath())) { using (FileStream fs = new FileStream(GetSavePath(), FileMode.Open)) await fs.CopyToAsync(canvas_data); } //Set timer save_timer.AutoReset = true; save_timer.Elapsed += DoAutosave; save_timer.Start(); return(true); }
private static RPCPayloadModifyCanvas_ListedCanvas ConvertCanvas(DbCanvas c) { return(new RPCPayloadModifyCanvas_ListedCanvas { color = c.color, href = Program.connection.config.hosts.master + "/api" + "/servers/" + c.server_id + "/canvas/" + c.id, id = c.id, name = c.name, thumbnail = c.thumbnail_url }); }
/// <summary> /// Loads canvas data /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task <DbCanvas> LoadCanvasData(ObjectId id) { var filterBuilder = Builders <DbCanvas> .Filter; var filter = filterBuilder.Eq("_id", id); var result = await system_canvases.FindAsync(filter); DbCanvas c = await result.FirstOrDefaultAsync(); if (c == null) { return(null); } return(c); }
private static void SendRPCMessage(DbCanvas c, DbServer server, DbUser u, int tribe_id, RPCPayloadModifyCanvas.RPCPayloadModifyCanvas_CanvasChange change) { //Create message RPCPayloadModifyCanvas msg = new RPCPayloadModifyCanvas { action = change, data = ConvertCanvas(c), user = new RPCPayloadModifyCanvas_ActorUser { icon = u.profile_image_url, id = u.id, name = u.screen_name } }; //Send RPC message Program.connection.GetRPC().SendRPCMessageToTribe(LibDeltaSystem.RPC.RPCOpcode.CanvasChange, msg, server, tribe_id); }
public static async Task OnCanvasRequest(Microsoft.AspNetCore.Http.HttpContext e, DbServer s, DbUser u, int tribe_id, string next) { //Find canvas if (!ObjectId.TryParse(next, out ObjectId id)) { throw new StandardError("Canvas Not Found", StandardErrorCode.NotFound); } DbCanvas c = await Program.connection.LoadCanvasData(id); if (c == null) { throw new StandardError("Canvas Not Found", StandardErrorCode.NotFound); } //Get request method var method = Program.FindRequestMethod(e); //Act from the method if (method == RequestHttpMethod.get) { //Write response await Program.QuickWriteJsonToDoc(e, ConvertCanvas(c)); } else if (method == RequestHttpMethod.post) { //Check scope await Program.CheckTokenScope(u, null); //Rename the canvas; decode request CanvasCreateRequest request = Program.DecodePostBody <CanvasCreateRequest>(e); //Set await c.RenameCanvas(Program.connection, request.name, request.color); //Send RPC message SendRPCMessage(c, s, u, tribe_id, RPCPayloadModifyCanvas.RPCPayloadModifyCanvas_CanvasChange.Modify); //Write response await Program.QuickWriteJsonToDoc(e, ConvertCanvas(c)); } else if (method == RequestHttpMethod.delete) { //Check scope await Program.CheckTokenScope(u, null); //Delete canvas await c.DeleteCanvas(Program.connection); //Send RPC message SendRPCMessage(c, s, u, tribe_id, RPCPayloadModifyCanvas.RPCPayloadModifyCanvas_CanvasChange.Delete); //Write response await Program.QuickWriteJsonToDoc(e, ConvertCanvas(c)); } else if (method == RequestHttpMethod.put) { //Check scope await Program.CheckTokenScope(u, null); //We'll update the thumbnail; Decode the request UpdateThumbnailRequest request = Program.DecodePostBody <UpdateThumbnailRequest>(e); //Try to find DbUserContent uc = await Program.connection.GetUserContentByToken(request.token); if (uc == null) { throw new StandardError("Token Not Valid", StandardErrorCode.InvalidInput); } if (uc.application_id != CANVAS_THUMBNAIL_APPLICATION_ID) { throw new StandardError("Specified User Content Application ID Mismatch", StandardErrorCode.InvalidInput); } //Update await c.SetNewThumbnail(Program.connection, uc); //Send RPC message SendRPCMessage(c, s, u, tribe_id, RPCPayloadModifyCanvas.RPCPayloadModifyCanvas_CanvasChange.Modify); //Write response await Program.QuickWriteJsonToDoc(e, ConvertCanvas(c)); } else { throw new StandardError("Unexpected method.", StandardErrorCode.BadMethod); } }
public static async Task OnListRequest(Microsoft.AspNetCore.Http.HttpContext e, DbServer s, DbUser u, int tribe_id) { //Get request method var method = Program.FindRequestMethod(e); //If this is a GET, list if (method == RequestHttpMethod.get) { //Find all canvases beloning to this server List <DbCanvas> canvases = await s.GetServerCanvases(Program.connection); //Now, convert all CanvasListResponse response = new CanvasListResponse { canvases = new RPCPayloadModifyCanvas_ListedCanvas[canvases.Count], ws_reconnect_policy = 10000, ws_url = Program.config.endpoint_canvas }; for (int i = 0; i < canvases.Count; i++) { response.canvases[i] = ConvertCanvas(canvases[i]); } //Write response await Program.QuickWriteJsonToDoc(e, response); return; } else if (method == RequestHttpMethod.post) { //Check scope await Program.CheckTokenScope(u, null); //We'll create a canvas. Decode the body CanvasCreateRequest request = Program.DecodePostBody <CanvasCreateRequest>(e); //Create DbCanvas c = new DbCanvas { color = request.color, last_edited = DateTime.UtcNow, last_editor = u._id, last_saved = DateTime.UtcNow, name = request.name, server_id = s.id, users = new ObjectId[256], user_index = 0, version = 0, _id = ObjectId.GenerateNewId() }; //Add await Program.connection.system_canvases.InsertOneAsync(c); //Send RPC message SendRPCMessage(c, s, u, tribe_id, RPCPayloadModifyCanvas.RPCPayloadModifyCanvas_CanvasChange.Create); //Write response await Program.QuickWriteJsonToDoc(e, ConvertCanvas(c)); } else { throw new StandardError("Unexpected method.", StandardErrorCode.BadMethod); } }