Beispiel #1
0
        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();
        }
Beispiel #2
0
        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"));
        }
Beispiel #3
0
        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
            });
        }
Beispiel #4
0
        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());
        }
Beispiel #5
0
        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("システムトラブルの可能性があります。開発者に問い合わせをお願いします。(送金は成功しています)");
            }
        }
Beispiel #8
0
        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 }));
        }