public void OnGet(ulong memberId) { UserContext = CoreService.GetUserContext(); VetMember = CoreService.DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == memberId); Amount = CoreService.CalcAmount(VetMember); Transactions = CoreService .GetCoinTransactionQuery(VetMember) .Include(c => c.RecivedVetMember) .Include(c => c.SendVetMember) .OrderByDescending(c => c.CreateDate); Trades = CoreService.DbContext .Trades .Include(c => c.VetMember) .Include(c => c.TradeMessages) .ThenInclude(c => c.VetMember) .OrderByDescending(c => c.TradeMessages.Max(d => d.CreateDate)) .ThenByDescending(c => c.CreateDate) .Where(c => c.VetMemberId == VetMember.Id) .Take(5) .ToArray(); Contracts = CoreService.DbContext .Contracts .Include(c => c.VetMember) .Include(c => c.Trade.VetMember) .Where(c => c.VetMemberId == VetMember.Id) .OrderByDescending(c => c.ContractMessages.Max(d => d.CreateDate)) .Take(5) .ToArray(); }
public async Task <IActionResult> OnPostAsync(long sendAmount, string message, int reciveVetMemberId) { UserContext = CoreService.GetUserContext(); if (UserContext == null) { return(NotFound()); } if (sendAmount <= 0) { this.ModelState.AddModelError("sendAmount", "1以上の数を指定してください"); return(OnGet(null)); } if (UserContext.Amount < sendAmount) { this.ModelState.AddModelError("sendAmount", "残高が不足しています"); return(OnGet(null)); } CoreService.AddTransaction(UserContext, sendAmount, message, reciveVetMemberId, CoinTransactionType.Transfer); await CoreService.SavechanesAsnc(); var reciveMember = DbContext.VetMembers.Find(reciveVetMemberId); var lastAmount = CoreService.CalcAmount(reciveMember); await Notification(UserContext.CurrentUser, reciveMember, sendAmount, message, lastAmount); return(RedirectToPage("/index")); }
public async Task <ActionResult <PostResult> > PostExteralApplicationPayment(PostRequest postRequest) { var discordIdUl = ulong.Parse(postRequest.DiscordId); var buyMember = await _context.VetMembers.AsQueryable().FirstOrDefaultAsync(c => c.DiscordId == discordIdUl); if (buyMember == null) { return(new PostResult { IsSucceed = false, ErrorMessage = "不正なユーザーのリクエストです" }); } var lestAmount = CoreService.CalcAmount(buyMember); if (lestAmount < postRequest.Amount) { return(new PostResult { IsSucceed = false, ErrorMessage = "残高不足です。" }); } var app = await _context.ExteralApplications.AsQueryable() .Include(c => c.VetMember) .FirstOrDefaultAsync(c => c.Id == postRequest.AppId); var entity = new ExteralApplicationPayment { ExteralApplicationId = postRequest.AppId, Amount = postRequest.Amount, Description = postRequest.Description, DiscordId = discordIdUl, RefJson = postRequest.RefJson, ExpirationDate = DateTimeOffset.Now.AddMinutes(5) }; _context.ExteralApplicationPayments.Add(entity); await _context.SaveChangesAsync(); //Todo:DMを送信する await SendConfirmNotificationAsync(app, buyMember, entity); return(new PostResult { IsSucceed = true }); }
public async Task <IActionResult> OnPostAsync(long sendAmount, string message, int reciveVetMemberId) { await Task.Yield(); UserContext = CoreService.GetUserContext(); if (UserContext == null) { return(NotFound()); } //if (sendAmount <= 0) //{ // this.ModelState.AddModelError("sendAmount", "1以上の数を指定してください"); // return OnGet(null); //} //if (UserContext.Amount < sendAmount) //{ // this.ModelState.AddModelError("sendAmount", "残高が不足しています"); // return OnGet(null); //} //CoreService.AddTransaction(UserContext , sendAmount, message, reciveVetMemberId, CoinTransactionType.Transfer); //await CoreService.SavechanesAsnc(); var issure = DbContext.VetMembers.FirstOrDefault(c => c.MemberType == MemberType.Issuer); DbContext.CoinTransactions.Add(new CoinTransaction { Amount = sendAmount, SendeVetMemberId = issure.Id, RecivedVetMemberId = reciveVetMemberId, Text = message, TransactionType = CoinTransactionType.Issue }); DbContext.SaveChanges(); MembersDdlInit(); ReciveMember = DbContext.VetMembers.Find(reciveVetMemberId); IssuedAmound = sendAmount; IsIssued = true; ReciverAmount = CoreService.CalcAmount(ReciveMember); return(Page()); }
public async Task <ActionResult <PutResult> > PutExteralApplicationPayment(Guid id, string discordId) { var discordIdul = ulong.Parse(discordId); var exteralApplicationPayment = await _context.ExteralApplicationPayments .Include(c => c.ExteralApplication) .AsQueryable() .FirstOrDefaultAsync(c => c.Id == id && c.DiscordId == discordIdul); if (exteralApplicationPayment == null) { return(NotFound()); } if (exteralApplicationPayment.ExpirationDate <= DateTimeOffset.Now) { return(new PutResult { IsSucceed = false, ErrorMessage = "有効期限切れ" }); } if (exteralApplicationPayment.IsPayd) { return(new PutResult { IsSucceed = false, ErrorMessage = "支払い済みのデータです" }); } //TODO:トランザクションを作る var venderId = exteralApplicationPayment.ExteralApplication.VetMemberId; var buyMember = await _context.VetMembers.AsQueryable().FirstOrDefaultAsync(c => c.DiscordId == discordIdul); var lestAmount = CoreService.CalcAmount(buyMember); if (lestAmount < exteralApplicationPayment.Amount) { return(new PutResult { IsSucceed = false, ErrorMessage = "残高不足" }); } var transaction = new CoinTransaction { SendeVetMemberId = buyMember.Id, RecivedVetMemberId = venderId, Amount = exteralApplicationPayment.Amount, Text = $"外部購入:{exteralApplicationPayment.ExteralApplication.Name}:{exteralApplicationPayment.Id}", }; exteralApplicationPayment.IsPayd = true; _context.CoinTransactions.Add(transaction); try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ExteralApplicationPaymentExists(id)) { return(new PutResult { IsSucceed = false, ErrorMessage = "DB書き込みに失敗しました。", }); } else { throw; } } return(new PutResult { IsSucceed = true, }); }
public async Task SendCoin(ulong fromId, ulong toId, int amount, IDMChannel fromDmChannel, IDMChannel toDmChannel, string jumpUrl) { var fromMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == fromId); if (fromMember == null) { await fromDmChannel.SendMessageAsync($"{StaticSettings.SiteTitle} 登録者以外は送信できません"); return; } var fromAmount = CoreService.CalcAmount(fromMember); if (fromAmount < amount) { await fromDmChannel.SendMessageAsync($"{StaticSettings.CurrenryUnit}残高が不足しています。({fromAmount}{StaticSettings.CurrenryUnit})"); return; } var toMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == toId); if (toMember == null) { await fromDmChannel.SendMessageAsync($"{StaticSettings.SiteTitle} 登録者以外へは送信できません"); return; //toMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == 287434171570192384); } var toAmount = CoreService.CalcAmount(toMember); if (toMember.Id == fromMember.Id) { //念のため同一人物の対応 toAmount -= amount; fromAmount += amount; } try { DbContext.CoinTransactions.Add(new CoinTransaction { SendeVetMemberId = fromMember.Id, Amount = amount, RecivedVetMemberId = toMember.Id, Text = "リアクション送金", TransactionType = CoinTransactionType.ReactionSend, }); await DbContext.SaveChangesAsync(); if (fromDmChannel != null) { await fromDmChannel.SendMessageAsync($@"Reaction:{toMember.Name} へ {amount} {StaticSettings.CurrenryUnit} を送金しました[{fromAmount - amount}vec]"); } await toDmChannel.SendMessageAsync($@"Reaction: {fromMember.Name} から {amount} {StaticSettings.CurrenryUnit} をもらいました[{toAmount + amount}vec] {jumpUrl}"); } catch { await fromDmChannel.SendMessageAsync("システムトラブルの可能性があります。開発者に問い合わせをお願いします。"); return; } }
public async Task PostSuperChat(ISocketMessageChannel channel, ulong fromId, ulong toId, int amount, string message, IDMChannel fromDmChannel, IDMChannel toDmChannel) { var fromMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == fromId); if (fromMember == null) { await fromDmChannel.SendMessageAsync("VetCoin 登録者以外はSuperChatを送信できません"); return; } var fromAmount = CoreService.CalcAmount(fromMember); if (fromAmount < amount) { await fromDmChannel.SendMessageAsync($"{StaticSettings.CurrenryUnit}残高が不足しています。({fromAmount}{StaticSettings.CurrenryUnit})"); return; } if (amount < StaticSettings.SuperChatLowLimit) { await fromDmChannel.SendMessageAsync($"送金下限は{StaticSettings.SuperChatLowLimit}{StaticSettings.CurrenryUnit}です。それ未満は送れません"); return; } if (amount > StaticSettings.SuperChatHeightLimit) { await fromDmChannel.SendMessageAsync($"送金上限は{StaticSettings.SuperChatHeightLimit}{StaticSettings.CurrenryUnit}です。それ以上は送れません"); return; } var toMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == toId); if (toMember == null) { await fromDmChannel.SendMessageAsync("VetCoin 登録者以外へはSuperChatを送信できません"); return; //toMember = DbContext.VetMembers.FirstOrDefault(c => c.DiscordId == 287434171570192384); } var toAmount = CoreService.CalcAmount(toMember); if (toMember.Id == fromMember.Id) { //念のため同一人物の対応 toAmount -= amount; fromAmount += amount; } try { if (fromDmChannel != null) { await fromDmChannel.SendMessageAsync($@"SuperChat:{toMember.Name}へ{amount}{StaticSettings.CurrenryUnit} 送金しました [{fromAmount - amount}{StaticSettings.CurrenryUnit}]"); } if (toDmChannel != null) { await toDmChannel.SendMessageAsync($@"SuperChat:{fromMember.Name}から{amount}{StaticSettings.CurrenryUnit} をもらいました [{toAmount + amount}{StaticSettings.CurrenryUnit}]"); } DbContext.CoinTransactions.Add(new CoinTransaction { SendeVetMemberId = fromMember.Id, Amount = amount, RecivedVetMemberId = toMember.Id, Text = message, TransactionType = CoinTransactionType.SuperChat, }); await DbContext.SaveChangesAsync(); } catch { await fromDmChannel.SendMessageAsync("システムトラブルの可能性があります。開発者に問い合わせをお願いします。"); return; } try { var imageMs = await CreateImage(fromMember, toMember, amount); await channel.SendFileAsync(imageMs, $"Send{amount}.png", message); } catch { await fromDmChannel.SendMessageAsync("システムトラブルの可能性があります。開発者に問い合わせをお願いします。(送金は成功しています)"); } }
public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } //DbContext.Attach(Contract).State = EntityState.Modified; var entity = DbContext.Contracts .Include(c => c.VetMember) .FirstOrDefault(c => c.Id == Contract.Id); var trade = DbContext.Trades .Include(c => c.VetMember) .FirstOrDefault(c => c.Id == entity.TradeId); //await TryUpdateModelAsync(entity, nameof(Contract)); //TODO:契約を結ぶためのコード var escrowUser = DbContext.VetMembers.First(c => c.MemberType == MemberType.Escrow); var escrowSendUser = trade.Direction == Direction.Buy ? DbContext.VetMembers.Find(trade.VetMemberId) : DbContext.VetMembers.Find(entity.VetMemberId); var restAmmount = CoreService.CalcAmount(escrowSendUser); if (restAmmount < entity.Reword) { IsInsufficientFunds = true; return(await OnGetAsync(Contract.Id)); } entity.ContractStatus = ContractStatus.Working; entity.EscrowTransaction = new CoinTransaction { RecivedVetMemberId = escrowUser.Id, Amount = entity.Reword, SendeVetMemberId = escrowSendUser.Id, Text = $"{trade.Title } 代金 {entity.Reword}VEC", TransactionType = CoinTransactionType.Contract }; try { await DbContext.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ContractExists(Contract.Id)) { return(NotFound()); } else { throw; } } await SendMessages(entity, trade.VetMember, entity.VetMember); return(RedirectToPage("./Index", new { contractId = Contract.Id })); }