Ejemplo n.º 1
0
        // Constructor To Bind the backend part to the UserControl
        public Schedule(UserInfo user, int index, HouseRules houseRules, Form parent)
        {
            InitializeComponent();

            this.parent  = (StudentForm)parent;
            scheduleItem = new ScheduleItem(user, index, houseRules);

            change = false;

            if (houseRules.AllRules[index].LastCompleted == DateTime.Today && user.ID != houseRules.AllRules[index].CurrentStudentId)
            {
                DoneBox.Enabled = true;
                DoneBox.Checked = true;
                this.BackColor  = Color.LightGreen;
            }
            else if (GetDays() == 0)
            {
                DoneBox.Enabled = true;
                DoneBox.Checked = false;
                this.BackColor  = Color.LightBlue;
            }
            else
            {
                DoneBox.Enabled = false;
                DoneBox.Checked = false;
                this.BackColor  = Color.LightGray;
            }

            change = true;
        }
Ejemplo n.º 2
0
        // Constructor that sets some info on the object correct in the instance variables
        public ScheduleItem(UserInfo user, int index, HouseRules houseRules)
        {
            this.houseRules     = houseRules;
            this.houseRule      = houseRules.AllRules[index];
            this.dateTimeBuffer = this.houseRule.LastCompleted;

            this.index = index;
            int timesUntilNextAppointment;

            if (houseRules.AllRules[index].LastCompleted == DateTime.Today && user.ID != houseRules.AllRules[index].CurrentStudentId)
            {
                timesUntilNextAppointment = 0;
            }
            else if (user.ID == houseRules.AllRules[index].CurrentStudentId)
            {
                timesUntilNextAppointment = 1;
            }
            else
            {
                int current = houseRule.CurrentStudentId;

                timesUntilNextAppointment = Math.Abs(user.ID - current);

                if (timesUntilNextAppointment < 0)
                {
                    timesUntilNextAppointment += houseRule.OrderOfStudents.Count;
                }

                timesUntilNextAppointment += 1;
            }

            this.ID = houseRule.CurrentStudentId;
            span    = houseRule.LastCompleted.AddDays(timesUntilNextAppointment * houseRule.Interval).Subtract(DateTime.Today);
        }
Ejemplo n.º 3
0
        // Constructor to make the adminform connect to the server
        // Sees if the server sends "updated", if so: updates
        public AdminForm(ServerConnection server, int houseNumber, UserInfo user)
        {
            InitializeComponent();

            Task.Run(() =>
            {
                udpClient.Client.Bind(new IPEndPoint(0, server.GetAvailableUdpPort()));

                int attempts   = 0;
                string message = "";
                while (true)
                {
                    Thread.Sleep(200);

                    int count  = udpClient.Client.Available;
                    byte[] msg = new byte[count];

                    if (msg.Length == 0 && attempts < 100)
                    {
                        continue;
                    }
                    else if (attempts >= 100)
                    {
                    }
                    else if (msg.Length == 0)
                    {
                        continue;
                    }

                    if (attempts < 100)
                    {
                        udpClient.Client.Receive(msg);
                        message = Encoding.Default.GetString(msg, 0, msg.Length);
                    }

                    if (message.Contains("Updated") || attempts >= 100)
                    {
                        _user.StudentsInfo = server.GetUsersInfo(_user.HouseNumber);
                        _mandatoryRules    = server.GetMandatoryRules(_user.HouseNumber);
                        _houseRules        = server.GetHouseRules(_user.HouseNumber);
                        _complaints        = server.GetComplaints(_user.HouseNumber);
                        _messages          = server.GetMessages(_user.HouseNumber);
                    }
                    ;

                    attempts = 0;
                }
            });

            _houseNumber    = houseNumber;
            _server         = server;
            _mandatoryRules = server.GetMandatoryRules(houseNumber);
            _houseRules     = server.GetHouseRules(houseNumber);
            _complaints     = server.GetComplaints(houseNumber);
            _messages       = server.GetMessages(houseNumber);
            _user           = user;

            UpdateTick(false);
        }
        public AddComplainStudent(HouseRules houseRules, MandatoryRules mandatoryRules, UserInfo user, Form form)
        {
            InitializeComponent();

            this.parent         = (StudentForm)form;
            this.houseRules     = houseRules;
            this.mandatoryRules = mandatoryRules;
            this.user           = user;
            cbAnon.Checked      = false;
        }
        public bool UpdateHouseRules(HouseRules houseRules)
        {
            Wait(25);

            string json = JsonConvert.SerializeObject(houseRules, Formatting.Indented);

            string message = GetResponce(PackageType.UPDATE_HOUSE_RULES, PackageType.RECEIVED, json);

            return(true);
        }
Ejemplo n.º 6
0
        // Updates the HouseRules
        private void UpdateHouseRulesLayout(HouseRules hr, bool showUpdate)
        {
            pnlHouseRules.SuspendLayout();
            pnlHouseRules.Controls.Clear();

            foreach (HouseRule rule in hr.AllRules)
            {
                AddHouseRule(rule, hr.AllRules.IndexOf(rule));
            }

            pnlHouseRules.ResumeLayout();
        }
Ejemplo n.º 7
0
        // Sets the task as being undone (for mistake purposes)
        public void SetUnDone(HouseRules hr)
        {
            houseRule.LastCompleted     = dateTimeBuffer.Subtract(TimeSpan.FromDays(houseRule.Interval));
            houseRule.CurrentStudentId -= 1;

            if (houseRule.CurrentStudentId < 1)
            {
                houseRule.CurrentStudentId = houseRule.OrderOfStudents.Count() - 1;
            }

            hr.AllRules[index] = this.houseRule;
            serverConnection.UpdateHouseRules(hr);
        }
Ejemplo n.º 8
0
        // Sets the task as being done
        public void SetDone(HouseRules hr)
        {
            dateTimeBuffer              = houseRule.LastCompleted;
            houseRule.LastCompleted     = DateTime.Today;
            houseRule.CurrentStudentId += 1;

            if (houseRule.CurrentStudentId > houseRule.OrderOfStudents.Count())
            {
                houseRule.CurrentStudentId = houseRule.OrderOfStudents[0];
            }

            hr.AllRules[index] = this.houseRule;
            serverConnection.UpdateHouseRules(hr);
        }
        public async Task <IActionResult> Create(
            [Bind("Name, Type, MaxTraveler, Description")] Accommodation accommodation,
            [Bind("StreetAndNumber, Complement, City, PostalCode, Country")] Address address,
            [Bind("ArrivalHour, DepartureHour, PetAllowed, PartyAllowed, SmokeAllowed")] HouseRules houseRules)
        {
            if (!ModelState.IsValid)
            {
                return(View(accommodation));
            }

            accommodation.UserId     = (await _userManager.GetUserAsync(User)).Id;
            accommodation.Address    = address;
            accommodation.HouseRules = houseRules;

            _context.Add(accommodation);
            await _context.SaveChangesAsync();

            return(RedirectToAction("ManagePictures", "Picture", new { id = accommodation.Id }));
        }
        public async Task <IActionResult> Edit(Guid id,
                                               [Bind("Id, Name, Type, MaxTraveler, Description")] Accommodation accommodation,
                                               [Bind("Id, StreetAndNumber, Complement, City, PostalCode, Country")] Address address,
                                               [Bind("Id, ArrivalHour, DepartureHour, PetAllowed, PartyAllowed, SmokeAllowed")] HouseRules houseRules)
        {
            if (id != accommodation.Id)
            {
                return(NotFound());
            }

            if (!ModelState.IsValid)
            {
                return(View(accommodation));
            }

            // Get accommodation's user
            accommodation.UserId = await _context.Accommodations.Where(a => a.Id == id).Select(a => a.UserId).SingleOrDefaultAsync();

            accommodation.Address    = address;
            accommodation.HouseRules = houseRules;

            try
            {
                _context.Update(accommodation);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AccommodationExists(accommodation.Id))
                {
                    return(NotFound());
                }

                throw;
            }

            return(RedirectToAction("Edit", new { id }));
        }
Ejemplo n.º 11
0
        public SecretHitler(SecretHitlerConfig config, Channel mainChannel, IList <User> users, HouseRules house = HouseRules.None)
        {
            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }
            if (mainChannel == null)
            {
                throw new ArgumentNullException(nameof(mainChannel));
            }
            if (users == null)
            {
                throw new ArgumentNullException(nameof(users));
            }

            _state      = GameState.Setup;
            _config     = config;
            _channel    = mainChannel;
            _players    = new List <Player>();
            _houseRules = house;
            int fas = 0;

            switch (users.Count)
            {
            case 5:
            case 6:
                fas = 2;
                break;

            case 7:
            case 8:
                fas = 3;
                break;

            case 9:
            case 10:
                fas = 4;
                break;

            default:
                break;
            }
            for (int i = 0; i < 16; i++)
            {
                users = (List <User>)users.Shuffle();
            }

            foreach (var user in users)
            {
                if (_players.Count == 0)
                {
                    _players.Add(new Player(user, _config.FascistParty, _config.Hitler));
                }
                else if (_players.Count(p => p.Party == _config.FascistParty) < fas)
                {
                    _players.Add(new Player(user, _config.FascistParty, _config.Fascist));
                }
                else
                {
                    _players.Add(new Player(user, _config.LiberalParty, _config.Liberal));
                }
            }

            for (int i = 0; i < 32; i++)
            {
                _players = (List <Player>)_players.Shuffle();
            }
            //_allPlayers = _players.Select(p => p.User.Id).ToArray();
            LiberalTrack = new List <BoardSpace>
            {
                new BoardSpace(BoardSpaceType.Blank),
                new BoardSpace(BoardSpaceType.Blank),
                new BoardSpace(BoardSpaceType.Blank),
                new BoardSpace(BoardSpaceType.Blank),
                new BoardSpace(BoardSpaceType.LiberalWin)
            };
            FascistTrack = new List <BoardSpace>();

            switch (_players.Count)
            {
            case 5:
            case 6:
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Blank));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Blank));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Examine));
                break;

            case 7:
            case 8:
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Blank));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Investigate));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.ChooseNextCandidate));
                break;

            case 9:
            case 10:
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Investigate));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.Investigate));
                FascistTrack.Add(new BoardSpace(BoardSpaceType.ChooseNextCandidate));
                break;

            default:
                break;
            }
            FascistTrack.Add(new BoardSpace(BoardSpaceType.Execution));
            FascistTrack.Add(new BoardSpace(BoardSpaceType.ExecutionVeto));
            FascistTrack.Add(new BoardSpace(BoardSpaceType.FascistWin));

            Deck = new Stack <PolicyType>(
                Enumerable.Repeat(PolicyType.Fascist, 11)
                .Concat(Enumerable.Repeat(PolicyType.Liberal, 6)));

            for (int i = 0; i < 32; i++)
            {
                Deck = new Stack <PolicyType>(Deck.Shuffle());
            }

            _channel.Client.MessageReceived += ProcessMessage;
            PropertyChanged += PropChanged;


            //_timer = new Timer(cb =>
            //{

            //},
            //null,
            //Timeout.Infinite,
            //10000);
        }
Ejemplo n.º 12
0
        //Updates information about all rules in the form
        public void RulesUpdateTick(bool showUpdate = true)
        {
            //Chacks mandatory rules
            if (mandatoryRules.AllRules.Count != pnlMandatoryRules.Controls.Count / 2)
            {
                pnlMandatoryRules.SuspendLayout();
                pnlMandatoryRules.Controls.Clear();

                foreach (MandatoryRule rule in mandatoryRules.AllRules)
                {
                    AddMandatoryRule(rule, mandatoryRules.AllRules.IndexOf(rule));
                }
                pnlMandatoryRules.ResumeLayout();
            }

            //Checks house rules
            if (houseRules.AllRules.Count != pnlHouseRules.Controls.Count / 3 + pnlNotifications.Controls.Count / 4)
            {
                pnlNotifications.Controls.Clear();
                pnlNotifications.SuspendLayout();

                pnlHouseRules.SuspendLayout();
                pnlHouseRules.Controls.Clear();

                int approved    = 0;
                int disapproved = 0;
                foreach (HouseRule rule in houseRules.AllRules)
                {
                    if (rule.ApprovalState == false)
                    {
                        AddNotificationsRule(rule, houseRules.AllRules.IndexOf(rule), disapproved);
                        disapproved++;
                    }
                    else
                    {
                        AddHouseRule(rule, houseRules.AllRules.IndexOf(rule), approved);
                        approved++;
                    }
                }
                pnlNotifications.ResumeLayout();
                pnlHouseRules.ResumeLayout();
            }

            HouseRules hr = houseRules.Clone();

            for (int i = 0; i < hr.AllRules.Count; i++)
            {
                int numberOfApprovals = 0;

                for (int j = 0; j < student.TotalStudentNumber; j++)
                {
                    numberOfApprovals += Convert.ToInt32(hr.AllRules[i].StudentsApproval[j + 1]);
                }

                if (numberOfApprovals > student.TotalStudentNumber / 2)
                {
                    if (hr.AllRules[i].ApprovalState == false)
                    {
                        hr.AllRules[i].ApprovalState = true;
                        pnlNotifications.SuspendLayout();
                        pnlNotifications.Controls.Clear();
                        pnlHouseRules.SuspendLayout();
                        pnlHouseRules.Controls.Clear();

                        int approved    = 0;
                        int disapproved = 0;
                        foreach (HouseRule rule in hr.AllRules)
                        {
                            if (rule.ApprovalState == false)
                            {
                                AddNotificationsRule(rule, hr.AllRules.IndexOf(rule), disapproved);
                                disapproved++;
                            }
                            else
                            {
                                AddHouseRule(rule, hr.AllRules.IndexOf(rule), approved);
                                approved++;
                            }
                        }
                        pnlNotifications.ResumeLayout();
                        pnlHouseRules.ResumeLayout();
                    }
                }
                else
                {
                    if (hr.AllRules[i].ApprovalState == true)
                    {
                        hr.AllRules[i].ApprovalState = false;
                        pnlNotifications.SuspendLayout();
                        pnlNotifications.Controls.Clear();
                        pnlHouseRules.SuspendLayout();
                        pnlHouseRules.Controls.Clear();

                        int approved    = 0;
                        int disapproved = 0;
                        foreach (HouseRule rule in hr.AllRules)
                        {
                            if (rule.ApprovalState == false)
                            {
                                AddNotificationsRule(rule, hr.AllRules.IndexOf(rule), disapproved);
                                disapproved++;
                            }
                            else
                            {
                                AddHouseRule(rule, hr.AllRules.IndexOf(rule), approved);
                                approved++;
                            }
                        }
                        pnlNotifications.ResumeLayout();
                        pnlHouseRules.ResumeLayout();
                    }
                }
            }

            if (_messages.AllMessages.Count != panelChat.Controls.Count)
            {
                for (int i = panelChat.Controls.Count; i < _messages.AllMessages.Count; i++)
                {
                    AddMessages(_messages.AllMessages[i]);
                }
                panelChat.VerticalScroll.Value = panelChat.VerticalScroll.Maximum;
            }
        }
Ejemplo n.º 13
0
        // Constructor to make the student form connect to the server
        // Sees if the server sends "updated", if so: updates
        public StudentForm(ServerConnection server, UserInfo student)
        {
            InitializeComponent();

            ThreadStart threadStart = new ThreadStart(updateTemperature);
            Thread      t1          = new Thread(threadStart);

            t1.Start();

            Task.Run(() =>
            {
                udpClient.Client.Bind(new IPEndPoint(0, server.GetAvailableUdpPort()));

                int attempts   = 0;
                string message = "";
                while (true)
                {
                    Thread.Sleep(100);
                    attempts++;

                    byte[] msg = new byte[udpClient.Client.Available];

                    if (msg.Length == 0 && attempts < 100)
                    {
                        continue;
                    }
                    else if (attempts >= 100)
                    {
                    }
                    else if (msg.Length == 0)
                    {
                        continue;
                    }

                    if (attempts < 100)
                    {
                        udpClient.Client.Receive(msg);
                        message = Encoding.Default.GetString(msg, 0, msg.Length);
                    }

                    if (message.Contains("Updated") || attempts >= 100)
                    {
                        student.StudentsInfo = server.GetUsersInfo(student.HouseNumber);
                        mandatoryRules       = server.GetMandatoryRules(student.HouseNumber);
                        houseRules           = server.GetHouseRules(student.HouseNumber);
                        complaints           = server.GetComplaints(student.HouseNumber);
                        _messages            = server.GetMessages(student.HouseNumber);

                        if (InvokeRequired)
                        {
                            Invoke((MethodInvoker) delegate
                            {
                                RulesUpdateTick();
                                UpdatesTick();
                                ScheduleUpdate();
                            });
                        }
                        else
                        {
                            RulesUpdateTick();
                            UpdatesTick();
                            ScheduleUpdate();
                        }
                    }
                    ;

                    attempts = 0;
                }
            });

            this.student  = student;
            this.server   = server;
            lblHello.Text = "Hello, " + this.student.Name;

            mandatoryRules = server.GetMandatoryRules(student.HouseNumber);
            houseRules     = server.GetHouseRules(student.HouseNumber);
            complaints     = server.GetComplaints(student.HouseNumber);
            _messages      = server.GetMessages(student.HouseNumber);

            ScheduleUpdate();

            timerUpdate.Start();

            RulesUpdateTick(false);
            UpdatesTick();
        }
Ejemplo n.º 14
0
        public static void RegisterSecretHitler(this DiscordClient client, IConfiguration config)
        {
            Console.WriteLine("Registering 'Secret Hitler'...");
            ReloadConfigs(Path.Combine(config["other"], "shitler.json"));

            client.GetService <CommandService>().CreateCommand("rules")
            .AddCheck((c, u, ch) => ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Quick summary of the rules.")
            .Do(async cea =>
            {
                var sb = new StringBuilder("How to play:\n")
                         .AppendLine("There are three roles: Liberal, Fascist, and Hitler.")
                         .AppendLine("Hitler does not know who his fellow Fascists are, but the Fascists know who Hitler is (except in 5 or 6 player games).")
                         .AppendLine("Liberals will always start off not knowing anything.")
                         .AppendLine("If 6 Fascist Policies are enacted, or Hitler is chosen as Chancellor in the late-game, the Fascists win.")
                         .AppendLine("If 5 Liberal Policies are enacted, or Hitler is successfully killed, the Liberals win.")
                         .AppendLine($"The following themes are available too: `{String.Join("`, `", configs.Select(c => c.Key))}`")
                         .AppendLine("For more details: https://dl.dropboxusercontent.com/u/502769/Secret_Hitler_Rules.pdf ")
                         .Append("Good luck, have fun.");

                await cea.Channel.SendMessage(sb.ToString());
            });

            client.GetService <CommandService>().CreateCommand("opensh")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            //.Parameter("type", ParameterType.Optional)
            .Description("Open up a game of Secret ~~Angry Manjew~~ Hitler for people to join.")
            .Do(async cea =>
            {
                if (!gameOpen)
                {
                    rules   = HouseRules.None;
                    players = new List <User>();
                    await cea.Channel.SendMessage("Opening up a round of Secret Hitler.");
                }
            });

            client.GetService <CommandService>().CreateCommand("reload")
            .AddCheck((c, u, ch) => u.Id == UInt64.Parse(config["Owner"]) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Hide()
            .Do(cea => ReloadConfigs(Path.Combine(config["other"], "shitler.json")));

            //client.GetService<CommandService>().CreateCommand("testsh")
            //    .AddCheck((c, u, ch) => u.Id == UInt64.Parse(config["Owner"]))
            //    .Hide()
            //    .Do(async cea =>
            //    {
            //        gameOpen = true;
            //        var joe = cea.User;
            //        var Game = new SecretHitler.SecretHitler(SecretHitlerConfig.Default, cea.Channel, new List<User> { joe, joe, joe, joe, joe });
            //        await Game.SetupGame();
            //        await Game.TestTurn(joe);
            //        await Game.TestNomination(joe, joe);
            //        game = Game;
            //    });

            client.GetService <CommandService>().CreateCommand("players")
            .AddCheck((c, u, ch) => ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Display the currently joined players.")
            .Do(async cea =>
            {
                await cea.Channel.SendMessage($"Current players are {String.Join(", ", players.Select(p => p.Name))}. ({players.Count})");
            });

            client.GetService <CommandService>().CreateCommand("join")
            .AddCheck((c, u, ch) => ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Join the game when it is open to play. At least 5 and at most 10 people can play. Using Voice is advised.")
            .Do(async cea =>
            {
                if (!gameOpen)
                {
                    if (players.Count == 10)
                    {
                        await cea.Channel.SendMessage($"The list is already full.");
                        return;
                    }

                    if (!players.Any(p => p.Id == cea.User.Id))
                    {
                        players.Add(cea.User);
                        await cea.Channel.SendMessage($"{cea.User.Name} joined the game.");
                    }
                }
                else
                {
                    await cea.Channel.SendMessage($"Game is already in progress.");
                }
            });

            client.GetService <CommandService>().CreateCommand("leave")
            .AddCheck((c, u, ch) => ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Leave a game if it has not been started yet.")
            .Do(async cea =>
            {
                if (!gameOpen)
                {
                    if (players.Any(p => p.Id == cea.User.Id))
                    {
                        players.Remove(cea.User);
                        await cea.Channel.SendMessage($"{cea.User.Name} left the game.");
                    }
                }
            });

            client.GetService <CommandService>().CreateCommand("startsh")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Parameter("type", ParameterType.Optional)
            .Description("Start a game. `.opensh` has to be called before this and at least 5 people must join.")
            .Do(async cea =>
            {
                if (!gameOpen && players != null)
                {
                    if (players.Count >= 5 && players.Count <= 10)
                    {
                        gameOpen = true;
                        await cea.Channel.SendMessage($"Setting up game with {players.Count} players.");
                        var gameConfig = configs.SingleOrDefault(c => c.Key == cea.Args[0]) ?? SecretHitlerConfig.Default;
                        game           = new SecretHitler.SecretHitler(gameConfig, cea.Channel, players);
                        await game.SetupGame();
                    }
                }
            });

            client.GetService <CommandService>().CreateCommand("house")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Parameter("rule", ParameterType.Unparsed)
            .Description("Apply a House Rule.")
            .Do(async cea =>
            {
                if (gameOpen)
                {
                    await cea.Channel.SendMessage("Cannot change rules while game is in progress.");
                    return;
                }

                switch (cea.Args[0])
                {
                case "skipfirst":
                    rules |= HouseRules.SkipFirstElection;
                    await cea.Channel.SendMessage("House rule added.");
                    break;

                default:
                    await cea.Channel.SendMessage("Unknown parameter.");
                    break;
                }
            });

            client.GetService <CommandService>().CreateCommand("state")
            .AddCheck((c, u, ch) => ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Display the current state of the game.")
            .Do(async cea =>
            {
                if (gameOpen)
                {
                    await cea.Channel.SendMessage(game.GetGameState());
                }
                else
                {
                    await cea.Channel.SendMessage("No game going on.");
                }
            });

            client.GetService <CommandService>().CreateCommand("turn")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("Advance to the next turn.")
            .Do(async cea => await game.StartTurn());

            client.GetService <CommandService>().CreateCommand("endsh")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Description("End the game early.")
            .Do(async cea => {
                await game.EndGame();
                gameOpen = true;
            });

            client.GetService <CommandService>().CreateCommand("cancel")
            .AddCheck((c, u, ch) => u.Roles.Select(r => r.Id).Contains(UInt64.Parse(config["FGO_Admins"])) && ch.Id == UInt64.Parse(config["FGO_SecretHitler"]))
            .Hide()
            .Do(async cea =>
            {
                gameOpen = false;
                await cea.Channel.SendMessage("Game canceled.");
            });
        }
Ejemplo n.º 15
0
        //Checks if needed files/directories exist
        //Creates new files if it is needed
        private void CheckExistedFiles(int houseNumber)
        {
            //Checks if directory for this house exists
            if (!Directory.Exists(@$ "data/house-{houseNumber}"))
            {
                //Creates new directory
                Directory.CreateDirectory(@$ "data/house-{houseNumber}");
            }

            //Checks if file for house rules exists
            if (!File.Exists(@$ "data/house-{houseNumber}/house-rules.json"))
            {
                //Creates a new object with zero rules
                HouseRules houseRules = new HouseRules
                {
                    HouseNumber = houseNumber,
                    AllRules    = new List <HouseRule>()
                };

                //Saves new file
                File.WriteAllText(@$ "data/house-{houseNumber}/house-rules.json",
                                  JsonConvert.SerializeObject(houseRules, Formatting.Indented));
            }

            //Checks if file for mandatory rules exists
            if (!File.Exists(@$ "data/house-{houseNumber}/mandatory-rules.json"))
            {
                //Creates a new object with zero rules
                MandatoryRules houseRules = new MandatoryRules
                {
                    HouseNumber = houseNumber,
                    AllRules    = new List <MandatoryRule>()
                };

                //Saves new file
                File.WriteAllText(@$ "data/house-{houseNumber}/mandatory-rules.json",
                                  JsonConvert.SerializeObject(houseRules, Formatting.Indented));
            }

            //Checks if file for users exists
            if (!File.Exists(@$ "data/house-{houseNumber}/students.json"))
            {
                //Creates a new object with zero users
                Users users = new Users
                {
                    TotalStudentNumber = 0,
                    AllUsers           = new List <ServerUser>()
                };

                //Saves new file
                File.WriteAllText(@$ "data/house-{houseNumber}/students.json",
                                  JsonConvert.SerializeObject(users, Formatting.Indented));
            }

            //Checks if file for complaints rules exists
            if (!File.Exists(@$ "data/house-{houseNumber}/complaints.json"))
            {
                //Creates a new object with zero complaints
                Complaints complaints = new Complaints
                {
                    HouseNumber   = houseNumber,
                    AllComplaints = new List <Complaint>()
                };

                //Saves new file
                File.WriteAllText(@$ "data/house-{houseNumber}/complaints.json",
                                  JsonConvert.SerializeObject(complaints, Formatting.Indented));
            }
            if (!File.Exists(@$ "data/house-{houseNumber}/messages.json"))
            {
                //Creates a new object with zero complaints
                ChatHistory messages = new ChatHistory
                {
                    HouseNumber = houseNumber,
                    AllMessages = new List <ChatMessage>()
                };

                //Saves new file
                File.WriteAllText(@$ "data/house-{houseNumber}/messages.json",
                                  JsonConvert.SerializeObject(messages, Formatting.Indented));
            }
        }
Ejemplo n.º 16
0
        //Handles received packages based on their types
        private void HandleDataQuery(TcpClient client, ServerPackage package)
        {
            //Based on the package type returns needed information
            switch (package.Type)
            {
            case PackageType.USER_CHECK:
            {
                CheckUdp(package.UdpServerPort);

                UserCheck  userCheck = JsonConvert.DeserializeObject <UserCheck>(package.Message);
                ServerUser user      = CheckUserInfo(client, userCheck);

                //Checks if user with given credentials exists
                if (user == null)
                {
                    //Sends "invalid data" error if user doesn't exist
                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.INVALID_DATA, "", -1)));
                }
                else
                {
                    Users users = JsonConvert.DeserializeObject <Users>(File.ReadAllText(@$ "data/house-{userCheck.HouseNumber}/students.json"));

                    Dictionary <int, string> usersInfo = new Dictionary <int, string>();

                    //Adds all student's Name and ID in a dictionary
                    foreach (var u in users.AllUsers)
                    {
                        usersInfo.Add(u.ID, u.Name);
                    }

                    //Generates new object with all needed info as a responce
                    UserInfo userInfo = new UserInfo()
                    {
                        Type               = user.Type,
                        ID                 = user.ID,
                        Name               = user.Name,
                        LastName           = user.LastName,
                        HouseNumber        = user.HouseNumber,
                        Room               = user.Room,
                        TotalStudentNumber = users.TotalStudentNumber,
                        StudentsInfo       = usersInfo
                    };

                    string json = JsonConvert.SerializeObject(userInfo);

                    //Sends responce
                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.USER_INFO, json, -1)));
                }
                break;
            }

            case PackageType.GET_ALL_USERS:
            {
                CheckUdp(package.UdpServerPort);

                Users users = JsonConvert.DeserializeObject <Users>(File.ReadAllText(@$ "data/house-{package.Message}/students.json"));

                Dictionary <int, string> usersInfo = new Dictionary <int, string>();

                //Adds all student's Name and ID in a dictionary
                foreach (var u in users.AllUsers)
                {
                    usersInfo.Add(u.ID, u.Name);
                }

                string json = JsonConvert.SerializeObject(usersInfo);

                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.ALL_USERS, json, -1)));

                break;
            }

            case PackageType.GET_HOUSE_RULES:
            {
                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(package.Message));
                CheckUdp(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.HOUSE_RULES,
                                                                                                File.ReadAllText(@$ "data/house-{package.Message}/house-rules.json"), -1)));
                break;
            }

            case PackageType.UPDATE_HOUSE_RULES:
            {
                HouseRules houseRules = JsonConvert.DeserializeObject <HouseRules>(package.Message);

                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(houseRules.HouseNumber));
                CheckUdp(package.UdpServerPort);

                //Update file
                File.WriteAllText(@$ "data/house-{houseRules.HouseNumber}/house-rules.json", package.Message);

                SendUpdated(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.RECEIVED, "", -1)));
                break;
            }

            case PackageType.GET_MANDATORY_RULES:
            {
                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(package.Message));
                CheckUdp(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.MANDATORY_RULES,
                                                                                                File.ReadAllText(@$ "data/house-{package.Message}/mandatory-rules.json"), -1)));
                break;
            }

            case PackageType.UPDATE_MANDATORY_RULES:
            {
                MandatoryRules mandatoryRules = JsonConvert.DeserializeObject <MandatoryRules>(package.Message);

                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(mandatoryRules.HouseNumber));
                CheckUdp(package.UdpServerPort);

                SendUpdated(package.UdpServerPort);

                //Update file
                File.WriteAllText(@$ "data/house-{mandatoryRules.HouseNumber}/mandatory-rules.json", package.Message);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.RECEIVED, "", -1)));
                break;
            }

            case PackageType.GET_COMPLAINTS:
            {
                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(package.Message));
                CheckUdp(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.COMPLAINTS,
                                                                                                File.ReadAllText(@$ "data/house-{package.Message}/complaints.json"), -1)));
                break;
            }

            case PackageType.UPDATE_COMPLAINTS:
            {
                MandatoryRules mandatoryRules = JsonConvert.DeserializeObject <MandatoryRules>(package.Message);

                //Checks if needed files/directories
                CheckExistedFiles(Convert.ToInt32(mandatoryRules.HouseNumber));
                CheckUdp(package.UdpServerPort);

                SendUpdated(package.UdpServerPort);

                //Update file
                File.WriteAllText(@$ "data/house-{mandatoryRules.HouseNumber}/complaints.json", package.Message);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.RECEIVED, "", -1)));
                break;
            }

            case PackageType.GET_MESSAGES:
            {
                //Checks if needed files/directories exist
                CheckExistedFiles(Convert.ToInt32(package.Message));
                CheckUdp(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.MESSAGES,
                                                                                                File.ReadAllText(@$ "data/house-{package.Message}/messages.json"), -1)));
                break;
            }

            case PackageType.UPDATE_MESSAGES:
            {
                ChatHistory chathistory = JsonConvert.DeserializeObject <ChatHistory>(package.Message);

                //Checks if needed files/directories
                CheckExistedFiles(Convert.ToInt32(chathistory.HouseNumber));
                CheckUdp(package.UdpServerPort);

                //Update file
                File.WriteAllText(@$ "data/house-{chathistory.HouseNumber}/messages.json", package.Message);

                SendUpdated(package.UdpServerPort);

                //Sends responce
                SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.RECEIVED, "", -1)));
                break;
            }

            case PackageType.UPDATE_PASSWORD:
            {
                CheckUdp(package.UdpServerPort);
                PasswordChange passwordChange = JsonConvert.DeserializeObject <PasswordChange>(package.Message);

                Users users = JsonConvert.DeserializeObject <Users>(File.ReadAllText(@$ "data/house-{passwordChange.HouseNumber}/students.json"));

                //Searches for login of the user based on his ID
                string login = users.AllUsers.Find(x => x.ID == passwordChange.ID).Login;

                UserCheck  userCheck = new UserCheck(login, passwordChange.CurrentPassword, passwordChange.HouseNumber);
                ServerUser user      = CheckUserInfo(client, userCheck);

                //Checks if user with given credentials exists
                if (user == null)
                {
                    //Sends "invalid data" error if user doesn't exist
                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.INVALID_DATA, "", -1)));
                }
                else
                {
                    foreach (var u in users.AllUsers)
                    {
                        //Searches needed user and changes his password
                        if (u.ID == user.ID)
                        {
                            u.Password = passwordChange.NewPassword;
                            break;
                        }
                    }

                    string json = JsonConvert.SerializeObject(users, Formatting.Indented);
                    File.WriteAllText(@$ "data/house-{userCheck.HouseNumber}/students.json", json);

                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.PASSWORD_CHANGED, "", -1)));
                }
                break;
            }

            case PackageType.CREATE_NEW_USER:
            {
                CheckUdp(package.UdpServerPort);
                ServerUser newUser = JsonConvert.DeserializeObject <ServerUser>(package.Message);

                Users users  = JsonConvert.DeserializeObject <Users>(File.ReadAllText(@$ "data/house-{newUser.HouseNumber}/students.json"));
                int   lastId = users.AllUsers.Max(x => x.ID);
                lastId++;

                newUser.ID = lastId;

                //If there are no users with the same login - proceed
                if (users.AllUsers.Any(x => x.Login == newUser.Login))
                {
                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.USER_EXISTS, "", -1)));
                }
                else
                {
                    users.AllUsers.Add(newUser);
                    users.TotalStudentNumber++;

                    string json = JsonConvert.SerializeObject(users, Formatting.Indented);
                    File.WriteAllText(@$ "data/house-{newUser.HouseNumber}/students.json", json);

                    HouseRules houseRules = JsonConvert.DeserializeObject <HouseRules>(
                        File.ReadAllText(@$ "data/house-{newUser.HouseNumber}/house-rules.json"));

                    foreach (var rule in houseRules.AllRules)
                    {
                        if (rule.ApprovalState)
                        {
                            rule.StudentsApproval.Add(newUser.ID, true);
                        }
                        else
                        {
                            rule.StudentsApproval.Add(newUser.ID, false);
                        }

                        rule.OrderOfStudents.Add(newUser.ID);
                    }

                    json = JsonConvert.SerializeObject(houseRules, Formatting.Indented);
                    File.WriteAllText(@$ "data/house-{newUser.HouseNumber}/house-rules.json", json);

                    SendMessage(package.Type, client, JsonConvert.SerializeObject(new ServerPackage(PackageType.USER_CREATED, "", -1)));
                }

                SendUpdated(package.UdpServerPort);
                break;
            }
            }
        }