Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Xml;
- using System.Xml.XPath;
- using MafiaSharp;
- using Hash.Chat;
- using Hash.Processing;
- using System.Timers;
- namespace Hash.Mafia {
- [Module("Mafia")]
- public sealed class MafiaModule : CommandModule {
- // XML message store stuff
- private static readonly XmlDocument messageStore = InitializeXmlStore();
- private static XmlDocument InitializeXmlStore() {
- XmlDocument store = new XmlDocument();
- store.LoadXml(Resources.MafiaMessages);
- return store;
- }
- private string GetMessage(string path) {
- string reply = messageStore.SelectSingleNode("root").SelectSingleNode(path).InnerText;
- return reply;
- }
- // Fields
- private Game currentGame;
- private TimedHandleList handles;
- private GameSetup defaultSetup;
- private TimedChecklist checklist;
- private Dictionary<string, PlayerContext> queryContexts;
- private Dictionary<string, TeamContext> teamContexts;
- private IrcChannel mainChannel;
- private IrcNetwork network;
- // Constructor
- public MafiaModule() {
- this.currentGame = new Game();
- this.handles = new TimedHandleList();
- this.defaultSetup = GameSetup.DefaultSetup;
- }
- // Methods
- public override MessageResponse ProcessMessage(int messageID) {
- return base.ProcessMessage(messageID);
- }
- private void InitializeGame() {
- this.currentGame = new Game();
- this.handles = new TimedHandleList();
- this.mainChannel.SetTopic(GetMessage("stateChange/idle/topic"));
- }
- private void EndGame() {
- if (this.teamContexts != null) {
- foreach(var context in teamContexts.Keys) {
- InstanceManager.Instance.GetInstanceByID(this.network.ID).Send(new IrcPartCommand(context));
- }
- }
- this.teamContexts = null;
- this.queryContexts = null;
- }
- private void InitStarting(IrcChannel context) {
- this.currentGame.Status = GameStatus.Starting;
- this.currentGame.InitStarting();
- this.mainChannel = context;
- this.mainChannel.BroadcastToUsers(new IrcModeCommand(this.mainChannel.Name, "-v [@context.user]"));
- this.mainChannel.OnUserEnter += ProcessUserEnterMainChannel;
- this.mainChannel.OnUserLeave += ProcessUserLeaveMainChannel;
- this.network = InstanceManager.Instance.GetNetworkByID(context.NetworkID);
- this.queryContexts = new Dictionary<string, PlayerContext>();
- this.teamContexts = new Dictionary<string, TeamContext>();
- }
- protected override bool Dispose(bool disposing) {
- if (base.Dispose(disposing)) {
- this.mainChannel.OnUserEnter -= ProcessUserEnterMainChannel;
- this.mainChannel.OnUserLeave -= ProcessUserLeaveMainChannel;
- return true;
- }
- return false;
- }
- private void ProcessUserEnterMainChannel(object sender, IrcUserEventArgs e) {
- IrcUser user = e.User;
- }
- private void ProcessUserLeaveMainChannel(object sender, IrcUserEventArgs e) {
- }
- private void InitSetup() {
- currentGame.Status = GameStatus.Setup;
- currentGame.InitSetup();
- PlayerCollection players = this.currentGame.Players;
- foreach (string handle in handles) {
- players.AddPlayer(handle);
- players[handle].UpdateState(PlayerState.Playing);
- }
- this.defaultSetup.InjectIntoPlayerCollection(players);
- var roles = players.GetRolesWhere(role => role != MafiaSharp.Roles.TownieRole.Instance);
- var loners = roles.Where(role => !role.IsTeamRole);
- foreach (var pair in loners.ToDictionary(role => players.Single(player => player.HasRole(role)).Handle, role => role)) {
- this.queryContexts.Add(pair.Key, new PlayerContext(pair.Value, pair.Key));
- }
- var teams = roles.Where(role => role.IsTeamRole);
- int random = new Random().Next(0, 1000);
- foreach (var teamRole in teams) {
- List<string> teamMembers = players.SelectByRole(teamRole).Select(player => player.Handle).ToList();
- string channelName = "#" + teamRole.Name + (random + teamRole.Faction);
- TeamContext currentTeamContext = new TeamContext(teamRole, teamMembers);
- this.network.EventManager.SubscribeToUserJoin(channelName, HandleTeamChannelUserJoin);
- this.network.EventManager.SubscribeToSelfJoin(channelName, HandleTeamChannelSelfJoin);
- InstanceManager.Instance.GetInstanceByID(this.network.ID).Send(new IrcJoinCommand(channelName));
- this.teamContexts.Add(channelName, currentTeamContext);
- }
- this.mainChannel.SetTopic(GetMessage("stateChange/setup/topic"));
- }
- private void HandleTeamChannelSelfJoin(object sender, IrcChannelEventArgs e) {
- e.Channel.SetMode("+si");
- TeamContext team = this.teamContexts[e.Channel.Name];
- team.Checklist.Initialize();
- var teamUsers = this.network.Users.Where(user => user.IsLoggedIn &&
- team.Members.Contains(user.Username));
- this.network.BroadcastToUsers(teamUsers,
- new IrcPrivmsgCommand("[@context.user]", Utils.Color(ColorCode.RoyalBlue, team.Role.RoleDescription)));
- this.network.BroadcastToUsers(teamUsers,
- new IrcPrivmsgCommand("[@context.user]", Utils.Color(ColorCode.RoyalBlue, team.Role.ActionDescription)));
- this.network.BroadcastToUsers(teamUsers,
- new IrcInviteCommand("[@context.user]", e.Channel.Name));
- }
- private void HandleTeamChannelUserJoin(object sender, IrcUserChannelEventArgs e) {
- TeamContext context = this.teamContexts[e.Channel.Name];
- context.Checklist.Check(e.User.Username);
- }
- // Module commands
- [Command("aye", "", IrcContextType.Channel, Hash.Data.AccessLevel.None)]
- private MessageResponse AyeCommand(int messageID, string[] arguments) {
- IrcUser user = MessageManager.Instance[messageID].User;
- switch (currentGame.Status) {
- case GameStatus.Starting:
- if (user.IsLoggedIn) {
- if (handles.Add(user.Username)) {
- this.network.BroadcastToUsers(receiver => (receiver.UserID == user.UserID),
- new IrcModeCommand(mainChannel.Name, "+v [@context.user]"));
- return new MessageResponse(messageID, CommandStatus.NullResponse, "Broadcasted command.");
- } else {
- return new MessageResponse(messageID, CommandStatus.LogicError,
- new IrcNoticeCommand("[@context.user]", "You are already playing."));
- }
- } else {
- return new MessageResponse(messageID, CommandStatus.LogicError, new IrcNoticeCommand("[@context.user]",
- "You need to log in to play. Please PM me with [$c=Brown|\"[$b|login] <username> <password>\"] to log in. " +
- "If you don't have an account you can register one with the command [$c=Brown|\"[$b|register] <username> <password>\"]. "));
- }
- case GameStatus.Setup:
- bool done = this.checklist.Check(user.Username);
- if (done) return AdvanceGameStatus(messageID, arguments);
- else return new MessageResponse(messageID, CommandStatus.NullResponse, "User is active.");
- default:
- return new MessageResponse(messageID, CommandStatus.UnknownCommand, "This command is invalid in the current context.");
- }
- }
- [Command("watching", "", IrcContextType.Channel, Hash.Data.AccessLevel.User)]
- private MessageResponse WatchingCommand(int messageID, string[] arguments) {
- IrcUser user = MessageManager.Instance[messageID].User;
- if (currentGame.Status == GameStatus.Starting) {
- if (handles.Remove(user.Username)) {
- this.network.BroadcastToUsers(receiver => (receiver.UserID == user.UserID),
- new IrcModeCommand(mainChannel.Name, "-v [@context.user]"));
- return new MessageResponse(messageID, CommandStatus.NullResponse, "Broadcasted command.");
- } else {
- return new MessageResponse(messageID, CommandStatus.LogicError, "You are not in the player list.");
- }
- } else {
- return new MessageResponse(messageID, CommandStatus.UnknownCommand, "This command is invalid in the current context.");
- }
- }
- [Command("start", "", IrcContextType.Channel, Data.AccessLevel.User)]
- private MessageResponse StartGameCommand(int messageID, string[] arguments) {
- if (currentGame.Status == GameStatus.Idle) {
- return AdvanceGameStatus(messageID, arguments);
- } else {
- return new MessageResponse(messageID, CommandStatus.LogicError,
- new IrcNoticeCommand("[@context.user]", "The game has already started"));
- }
- }
- [Command("advance", "", IrcContextType.Channel, Data.AccessLevel.Owner)]
- private MessageResponse AdvanceGameStatus(int messageID, string[] arguments) {
- string reply = String.Empty;
- switch (currentGame.Status) {
- case GameStatus.Idle:
- this.InitStarting((IrcChannel) MessageManager.Instance[messageID].Source);
- this.mainChannel.SetTopic(GetMessage("stateChange/starting/topic"));
- reply = GetMessage("stateChange/starting/channel");
- break;
- case GameStatus.Starting:
- this.InitSetup();
- reply = GetMessage("stateChange/setup/channel");
- break;
- case GameStatus.Setup:
- currentGame.Status = GameStatus.Running;
- currentGame.InitRunning();
- reply = GetMessage("stateChange/running/channel");
- checklist = new TimedChecklist(handles.ToList());
- checklist.Initialize();
- break;
- case GameStatus.Running:
- currentGame.Status = GameStatus.Over;
- break;
- case GameStatus.Over:
- InitializeGame();
- break;
- default:
- break;
- }
- if (String.IsNullOrEmpty(reply)) {
- return new MessageResponse(messageID, CommandStatus.Success, Utils.GetFormattedString(
- "The game status is now '{0}'", Enum.GetName(typeof(GameStatus), currentGame.Status)));
- } else {
- return new MessageResponse(messageID, CommandStatus.Success, reply);
- }
- }
- [Command("endthis", "", IrcContextType.Channel, Data.AccessLevel.Owner)]
- private MessageResponse EndGameCommand(int messageID, string[] arguments) {
- if (this.currentGame.Status != GameStatus.Idle) {
- EndGame();
- InitializeGame();
- return new MessageResponse(messageID, CommandStatus.NullResponse, "Game reinitialized.");
- } else {
- return new MessageResponse(messageID, CommandStatus.LogicError, "No game currently running.");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement