public MarkNotCompletedTasksDaily(UnixUtcTime firstExecution, TaskInstances taskInstances)
     : base(firstExecution, TimeSpan.FromDays(1),
            () => taskInstances
            .ActiveItemsDueBefore(Clock.UnixUtcNow.Minus(TimeSpan.FromDays(2)))
            .Select(x => taskInstances.Apply(
                        new MarkTaskNotComplete { Id = x.Id, At = Clock.UnixUtcNow, ApproverUserId = new ServiceUser() })))
 {
 }
예제 #2
0
 /// <summary>
 /// 转移任务交接对象(用于接任务和交任务不在同一个NPC的情况)
 /// </summary>
 /// <param name="t"></param>
 public void TransferTaskToThis(Task t)
 {
     if (!t)
     {
         return;
     }
     TaskInstances.Add(t);
     t.currentTaskGiver = this._ID;
 }
예제 #3
0
    private void InitTask(Task[] ts)
    {
        if (ts.Length == 0)
        {
            return;
        }
        if (taskInstances.Count > 0)
        {
            taskInstances.Clear();
        }
        foreach (Task t in ts)
        {
            if (t)
            {
                foreach (CollectObjective co in t.CollectObjectives)
                {
                    t.Objectives.Add(co);
                }
                foreach (KillObjective ko in t.KillObjectives)
                {
                    t.Objectives.Add(ko);
                }
                foreach (TalkObjective to in t.TalkObjectives)
                {
                    t.Objectives.Add(to);
                }

                if (t.CmpltObjectiveInOrder)
                {
                    t.Objectives.Sort((x, y) =>
                    {
                        if (x.OrderIndex > y.OrderIndex)
                        {
                            return(1);
                        }
                        else if (x.OrderIndex < y.OrderIndex)
                        {
                            return(-1);
                        }
                        else
                        {
                            return(0);
                        }
                    });
                    for (int i = 1; i < t.Objectives.Count; ++i)
                    {
                        if (t.Objectives[i].OrderIndex >= t.Objectives[i - 1].OrderIndex)
                        {
                            t.Objectives[i].PreObjective      = t.Objectives[i - 1];
                            t.Objectives[i - 1].NextObjective = t.Objectives[i];
                        }
                    }
                }
                int n1, n2, n3;
                n1 = n2 = n3 = 1;
                foreach (Objective o in t.Objectives)
                {
                    if (o is CollectObjective)
                    {
                        o.obID = t.TaskID + "_C0" + n1;
                        n1++;
                    }
                    if (o is KillObjective)
                    {
                        o.obID = t.TaskID + "_K0" + n2;
                        n2++;
                    }
                    if (o is TalkObjective)
                    {
                        o.obID = t.TaskID + "_T0" + n3;
                        n3++;
                    }
                }
                if (TaskMgr.Instance.HasOngoingTask(t) && !t.CmpltOnOriginalNpc && t.AcceptAble)
                {
                    if (!TaskGiverMgr.Instance.GiverTransferStation.ContainsKey(t.CmpltNpcID))
                    {
                        TaskGiverMgr.Instance.GiverTransferStation.Add(t.CmpltNpcID, ResMgr.Instance.Load <Task>(t.TaskID));
                    }
                    TaskGiverMgr.Instance.GiverTransferStation[t.CmpltNpcID].originTaskGiver  = this._ID;
                    TaskGiverMgr.Instance.GiverTransferStation[t.CmpltNpcID].currentTaskGiver = this._ID;
                }
                else
                {
                    t.originTaskGiver  = this._ID;
                    t.currentTaskGiver = this._ID;
                    TaskInstances.Add(t);
                }
            }
        }
        currentTask = GetCurrentTask();
    }
예제 #4
0
        public void ConfigureServices(IServiceCollection services)
        {
            try
            {
                services.AddCors();
                services.AddMvc();

                var sqlDb = new SqlDatabase(new EnvironmentVariable("HomeTaskManagementSqlConnection"));
                services.AddSingleton(new MiniAuth(new EnvironmentVariable("HomeTaskManagementSecret")));
                services.AddSingleton(new AppHealth(TimeSpan.FromMinutes(15), sqlDb));
                var eventStore = new SqlEventStore(sqlDb, "HomeTask.Events");
                var blobStore  = new SqlBlobStore(sqlDb, "HomeTask.Blobs");

                var messages = new Messages();
                var users    = new Users(new UsersTable(sqlDb));
                services.AddSingleton(users);
                var tasks    = new Tasks(new TasksTable(sqlDb));
                var accounts = new Accounts(eventStore);
                services.AddSingleton(accounts);
                var pledges       = new Pledges(eventStore, users, accounts, new PledgeFundingSettings());
                var assignments   = new TaskAssignments(eventStore, tasks, users, new AssignmentSettings());
                var taskInstances = new TaskInstances(new InMemoryTaskInstanceStore(), assignments, messages);
                var treasury      = new Treasury(blobStore, accounts);

                services.AddSingleton(users);

                services.AddSingleton(new AppCommands(new Dictionary <string, IRequest>(StringComparer.InvariantCultureIgnoreCase)
                {
                    { nameof(OpenAccount), new AdminOnly(new JsonRequest <OpenAccount>(x => accounts.Apply(x))) },
                    { nameof(SetOverdraftPolicy), new AdminOnly(new JsonRequest <SetOverdraftPolicy>(x => accounts.Apply(x))) },
                    { nameof(TransactionRequest), new AdminOnly(new JsonRequest <TransactionRequest>(x => accounts.Apply(x))) },

                    { nameof(RegisterUser), new JsonRequest <RegisterUser>(x => users.Apply(x)) },
                    { nameof(UnregisterUser), new JsonRequest <UnregisterUser>(x => users.Apply(x)) },
                    { nameof(AddRoles), new AdminOnly(new JsonRequest <AddRoles>(x => users.Apply(x))) },
                    { nameof(RemoveRoles), new AdminOnly(new JsonRequest <RemoveRoles>(x => users.Apply(x))) },

                    { nameof(AssignTask), new AdminOnly(new JsonRequest <AssignTask>(x => assignments.Apply(x))) },

                    { nameof(CreateTask), new AdminOnly(new JsonRequest <CreateTask>(x => tasks.Apply(x))) },
                    { nameof(DeleteTask), new AdminOnly(new JsonRequest <DeleteTask>(x => tasks.Apply(x))) },

                    { nameof(SetPledge), new AdminOnly(new JsonRequest <SetPledge>(x => pledges.Apply(x))) },
                    { nameof(FundPledges), new ServiceOrAdmin(new JsonRequest <FundPledges>(x => pledges.Apply(x))) },

                    { nameof(MarkTaskComplete), new ApproverOnly(new JsonRequest <MarkTaskComplete>(x => taskInstances.Apply(x))) },
                    { nameof(MarkTaskNotComplete), new JsonRequest <MarkTaskNotComplete>(x => taskInstances.Apply(x)) },
                    { nameof(MarkTaskFunded), new ServiceOrAdmin(new JsonRequest <MarkTaskFunded>(x => taskInstances.Apply(x))) },
                    { nameof(ScheduleWorkItemsThrough), new ServiceOrAdmin(new JsonRequest <ScheduleWorkItemsThrough>(x => taskInstances.Apply(x))) },
                    { nameof(WaiveTask), new AdminOnly(new JsonRequest <WaiveTask>(x => taskInstances.Apply(x))) },

                    { nameof(RecordExpenditure), new JsonRequest <RecordExpenditure>(x => treasury.Apply(x)) }
                }));

                services.AddSingleton(new AppQueries(new Dictionary <string, IRequest>(StringComparer.InvariantCultureIgnoreCase)
                {
                    { "accounts", new ParameterlessRequest(() => accounts.GetAll().Select(x => new AccountBalance {
                            Name = users.Get(x.Id).Name, Balance = x.Balance
                        })) },
                    { nameof(Account), new JsonRequest <GetById>(x => Response.Success(accounts.Get(x.Id))) }
                }));

                new AppRecurringTasks(
                    new FundPledgesDaily(pledges),
                    new MarkNotCompletedTasksDaily(taskInstances),
                    new ScheduleTasksDaily(taskInstances))
                .Start();

                new HandleTaskInstanceCompletionPayments(taskInstances, accounts, messages)
                .Start();

                new FundScheduledTasks(taskInstances, accounts, messages)
                .Start();
            }
            catch (Exception e)
            {
                Console.WriteLine($"Fatal error in Startup: {e.Message}");
                Debug.WriteLine($"Fatal error in Startup: {e.Message}");
                Environment.Exit(-1);
            }
        }
 public HandleTaskInstanceCompletionPayments(TaskInstances taskInstances, Accounts accounts, Messages messages)
 {
     _taskInstances = taskInstances;
     _accounts      = accounts;
     _messages      = messages;
 }
예제 #6
0
 public FundScheduledTasks(TaskInstances taskInstances, Accounts accounts, Messages messages)
 {
     _taskInstances = taskInstances;
     _accounts      = accounts;
     _messages      = messages;
 }
 public MarkNotCompletedTasksDaily(TaskInstances taskInstances)
     : this(Clock.UnixUtcNow.StartOfDay().Plus(TimeSpan.FromDays(1)), taskInstances)
 {
 }
예제 #8
0
 public ScheduleTasksDaily(TaskInstances taskInstances)
     : this(Clock.UnixUtcNow.StartOfDay().Plus(TimeSpan.FromDays(1)), taskInstances)
 {
 }
예제 #9
0
 public ScheduleTasksDaily(UnixUtcTime firstExecution, TaskInstances taskInstances)
     : base(firstExecution, TimeSpan.FromDays(1),
            () => taskInstances.Apply(new ScheduleWorkItemsThrough(Clock.UnixUtcNow.Plus(TimeSpan.FromDays(1)))))
 {
 }