"use strict"; var SelectPlayerButton = React.createClass({ selectPlayer(e) { e.preventDefault(); socket.emit("gather:select", { player: parseInt(e.target.value, 10) }) }, render() { let button; if (this.props.gatherer.leader) { button = ; } else if (this.props.gatherer.team !== "lobby") { button = ; } else { button = ; } return button; } }); var GathererList = React.createClass({ memberList() { var self = this; return this.props.gather.gatherers .filter(gatherer => gatherer.team === self.props.team) .sort(gatherer => { return gatherer.leader ? 1 : -1 }); }, render() { var extractGatherer = gatherer => { let image; if (gatherer.leader) { image = ; } return ( {image}{gatherer.user.username} ); } var members = this.memberList() .map(extractGatherer); return ( {members}
); } }); var GatherTeams = React.createClass({ render() { return (
Marines
Aliens
); } }); var ElectionProgressBar = React.createClass({ componentDidMount() { var self = this; this.timer = setInterval(() => { self.forceUpdate(); }, 900); }, progress() { var interval = this.props.gather.election.interval; var startTime = (new Date(this.props.gather.election.startTime)).getTime(); var msTranspired = Math.floor((new Date()).getTime() - startTime); return { num: msTranspired, den: interval, barMessage: Math.floor((interval - msTranspired) / 1000) + "s remaining" } }, componentWillUnmount() { clearInterval(this.timer); }, render() { return (); } }); var ProgressBar = React.createClass({ render() { let progress = this.props.progress; var style = { width: Math.round((progress.num / progress.den * 100)) + "%" }; var barMessage = progress.barMessage || ""; return (
{barMessage}
); } }); var GatherProgress = React.createClass({ stateDescription() { switch(this.props.gather.state) { case "gathering": return "Waiting for more gatherers."; case "election": return "Currently voting for team leaders."; case "selection": return "Waiting for leaders to pick teams."; case "done": return "Gather completed."; default: return "Initialising gather."; } }, gatheringProgress() { var num = this.props.gather.gatherers.length; var den = 12; var remaining = den - num; var message = (remaining === 1) ? "Waiting for last player" : `Waiting for ${remaining} more players`; return { num: num, den: den, message: message }; }, electionProgress() { var num = this.props.gather.gatherers.reduce((acc, gatherer) => { if (gatherer.leaderVote) acc++; return acc; }, 0); var den = 12; return { num: num, den: den, message: den - num + " more votes required" }; }, selectionProgress() { var num = this.props.gather.gatherers.reduce((acc, gatherer) => { if (gatherer.team !== "lobby") acc++; return acc; }, 0); var den = 12; return { num: num, den: den, message: `${num} out of ${den} players assigned. Waiting on ${_.capitalize(this.props.gather.pickingTurn)}s to pick next...` }; }, render() { var progress, progressBar; var gatherState = this.props.gather.state; if (gatherState === 'gathering' && this.props.gather.gatherers.length) { progress = this.gatheringProgress(); progressBar = (); } else if (gatherState === 'election') { progress = this.electionProgress(); progressBar = (); } else if (gatherState === 'selection') { progress = this.selectionProgress(); progressBar = (); } if (!progress) return false; return (

{this.stateDescription()} {progress.message}

{progressBar}
); } }); let teamspeakDefaults = { url: "ts3server://ensl.org/", password: "ns2gather", alien: { channel: "NS2 Gather/Gather #1/Alien", password: "ns2gather" }, marine: { channel: "NS2 Gather/Gather #1/Marine", password: "ns2gather" } }; var TeamSpeakButton = React.createClass({ getDefaultProps() { return teamspeakDefaults }, marineUrl() { return this.teamSpeakUrl(this.props.marine); }, alienUrl() { return this.teamSpeakUrl(this.props.alien); }, teamSpeakUrl(conn) { let params = `channel=${encodeURIComponent(conn.channel)}& channelpassword=${encodeURIComponent(conn.password)}`; return (`${this.props.url}?${params}`); }, render() { return ( ); } }); var TeamSpeakModal = React.createClass({ getDefaultProps() { return teamspeakDefaults; }, render() { return

Teamspeak Server Information

Server
{this.props.url}
Password
{this.props.password}
Marine Channel
{this.props.marine.channel}
Alien Channel
{this.props.alien.channel}
} }); var JoinGatherButton = React.createClass({ componentDidMount() { var self = this; this.timer = setInterval(() => { self.forceUpdate(); }, 30000); }, componentWillUnmount() { clearInterval(this.timer); }, joinGather(e) { e.preventDefault(); socket.emit("gather:join"); }, leaveGather(e) { e.preventDefault(); socket.emit("gather:leave"); }, cooldownTime() { let user = this.props.user; if (!user) return false; let cooloffTime = this.props.gather.cooldown[user.id]; if (!cooloffTime) return false; let timeRemaining = new Date(cooloffTime) - new Date(); return timeRemaining > 0 ? timeRemaining : false; }, render() { let gather = this.props.gather; let thisGatherer = this.props.thisGatherer; if (thisGatherer) { return ; } if (gather.state === 'gathering') { let cooldownTime = this.cooldownTime(); if (cooldownTime) { return ; } else { return ; } } return false; } }); var CooloffButton = React.createClass({ timeRemaining() { return `${Math.floor(this.props.timeRemaining / 60000) + 1} minutes remaining`; }, render() { return } }) var GatherActions = React.createClass({ voteRegather(e) { e.preventDefault(e); socket.emit("gather:vote", { regather: (e.target.value === "true") }); }, regatherVotes() { let gather = this.props.gather; if (!gather) return 0; return gather.gatherers.reduce((acc, gatherer) => { if (gatherer.regatherVote) acc++; return acc; }, 0); }, render() { let regatherButton; let user = this.props.user; let gather = this.props.gather; let thisGatherer = this.props.thisGatherer; if (thisGatherer) { let regatherVotes = this.regatherVotes(); if (thisGatherer.regatherVote) { regatherButton = ; } else { regatherButton = ; } } return (
  • {regatherButton}
); } }); var VoteButton = React.createClass({ cancelVote(e) { socket.emit("gather:vote", { leader: { candidate: null } }); }, vote(e) { e.preventDefault(); socket.emit("gather:vote", { leader: { candidate: parseInt(e.target.value, 10) } }); }, render() { let candidate = this.props.candidate; let thisGatherer = this.props.thisGatherer; if (thisGatherer === null) { return false; } if (thisGatherer.leaderVote === candidate.id) { return ( ); } else { return ( ); } } }); var ServerVoting = React.createClass({ voteHandler(serverId) { return function (e) { e.preventDefault(); socket.emit("gather:vote", { server: { id: serverId } }); } }, votesForServer(server) { return this.props.gather.gatherers.reduce((acc, gatherer) => { if (gatherer.serverVote.some(voteId => voteId === server.id)) acc++; return acc; }, 0); }, render() { let self = this; let thisGatherer = self.props.thisGatherer; let servers = self.props.servers.sort((a, b) => { var aVotes = self.votesForServer(a); var bVotes = self.votesForServer(b); return bVotes - aVotes; }).map(server => { let votes = self.votesForServer(server); if (thisGatherer.serverVote.some(voteId => voteId === server.id)) { return ( e.preventDefault() } key={server.id}> {votes} {server.name || server.description} ); } else { return ( {votes} {server.name || server.description} ); } }); let votes = thisGatherer.serverVote.length; return (
{votes === 2 ? "Server Votes" : `Please Vote for a Server. ${2 - votes} votes remaining` }
{servers}
); } }) var MapVoting = React.createClass({ voteHandler(mapId) { return function (e) { e.preventDefault(); socket.emit("gather:vote", { map: { id: mapId } }); } }, votesForMap(map) { return this.props.gather.gatherers.reduce((acc, gatherer) => { if (gatherer.mapVote.some(voteId => voteId === map.id)) acc++; return acc; }, 0); }, render() { var self = this; let thisGatherer = self.props.thisGatherer let maps = self.props.maps.sort((a, b) => { var aVotes = self.votesForMap(a); var bVotes = self.votesForMap(b); return bVotes - aVotes; }).map(map => { let votes = self.votesForMap(map); if (thisGatherer.mapVote.some(voteId => voteId === map.id)) { return ( e.preventDefault() } className="list-group-item list-group-item-success"> {votes} {map.name} ); } else { return ( {votes} {map.name} ); } }); let votes = thisGatherer.mapVote.length; return (
{votes === 2 ? "Map Votes" : `Please Vote for a Map. ${2 - votes} votes remaining` }
{maps}
); } }) var Gather = React.createClass({ render() { let gather = this.props.gather; let thisGatherer = this.props.thisGatherer; let servers = this.props.servers; let maps = this.props.maps; let user = this.props.user; if (gather === null) return
; let voting; if (thisGatherer) { let state = gather.state; if (state === 'gathering' || state === 'election') { voting = (
); } else { voting = ; } } let gatherTeams; if (gather.state === 'selection') { gatherTeams = ; } if (gather.gatherers.length > 0) { return (
Current Gather
{gatherTeams} {voting}
); } else { return (
Current Gather
); } } }); var LifeformIcons = React.createClass({ availableLifeforms() { return ["skulk", "gorge", "lerk", "fade", "onos", "commander"]; }, gathererLifeforms() { let lifeforms = []; let gatherer = this.props.gatherer; let abilities = gatherer.user.profile.abilities; for (let attr in abilities) { if (abilities[attr]) lifeforms.push(_.capitalize(attr)); } return lifeforms; }, render() { let lifeforms = this.gathererLifeforms(); let availableLifeforms = this.availableLifeforms(); let icons = availableLifeforms.map(lifeform => { let containsAbility = lifeforms.some(gathererLifeform => { return gathererLifeform.toLowerCase() === lifeform.toLowerCase() }); if (containsAbility) { return {lifeform} } else { return } }); return {icons} } }); var Gatherers = React.createClass({ joinGather(e) { e.preventDefault(); socket.emit("gather:join"); }, bootGatherer(e) { e.preventDefault(); socket.emit("gather:leave", { gatherer: parseInt(e.target.value, 10) || null }); }, render() { let self = this; let user = this.props.user; let gather = this.props.gather; let admin = (user && user.admin) || (user && user.moderator); let thisGatherer = this.props.thisGatherer; let gatherers = gather.gatherers .sort((a, b) => { return (b.user.hive.skill || 1000) - (a.user.hive.skill || 1000); }) .map(gatherer => { if (gatherer.user.country) { var country = ( {gatherer.user.country} ); }; let skill = gatherer.user.profile.skill || "Not Available"; let hiveStats = []; if (gatherer.user.hive.skill) hiveStats.push(`${gatherer.user.hive.skill} ELO`); if (gatherer.user.hive.playTime) { hiveStats.push(`${Math.floor(gatherer.user.hive.playTime / 3600)} Hours`); } let hive = (hiveStats.length) ? hiveStats.join(", ") : "Not Available"; let team = (gatherer.user.team) ? gatherer.user.team.name : "None"; let action; if (gather.state === "election") { let votes = gather.gatherers.reduce((acc, voter) => { if (voter.leaderVote === gatherer.id) acc++; return acc; }, 0) action = ( {votes + " votes"} ); } if (gather.state === 'selection') { if (thisGatherer && thisGatherer.leader && thisGatherer.team === gather.pickingTurn) { action = ( ); } else { if (gatherer.leader) { action = (Leader); } else if (gatherer.team !== "lobby") { action = ({_.capitalize(gatherer.team)}); } else { action = ( Lobby); } } } let adminOptions; if (admin) { adminOptions = [
,
Admin
,
 
] } let tabColor = gatherer.team !== "lobby" ? `panel-${gatherer.team}` : "panel-info"; return (

{country} {gatherer.user.username} {action}

Skill Level
{skill}
Team
{team}
Hive Stats
{hive}
Links
ENSL Profile  Hive Profile
{adminOptions}
); }) if (gather.gatherers.length) { return (
{gatherers}
); } else { return (
); } } }); var CompletedGather = React.createClass({ completionDate() { let d = new Date(this.props.gather.done.time); if (d) { return d.toLocaleTimeString(); } else { return "Completed Gather" } }, getInitialState() { return { show: !!this.props.show }; }, toggleGatherInfo() { let newState = !this.state.show; this.setState({ show: newState }); }, render() { let gatherInfo = []; let gather = this.props.gather; let maps = this.props.maps; let servers = this.props.servers; if (this.state.show) { gatherInfo.push(); gatherInfo.push(); } return (
{this.completionDate()}
{gatherInfo}
); } }); var GatherVotingResults = React.createClass({ // Returns an array of ids voted for e.g. [1,2,5,1,1,3,2] countVotes(voteType) { return this.props.gather.gatherers.reduce((acc, gatherer) => { let votes = gatherer[voteType]; // Temporary fix because some mapvotes are ints and not arrays if (!Array.isArray(votes)) votes = [votes]; if (votes.length > 0) votes.forEach(vote => acc.push(vote)); return acc; }, []); }, selectedMaps() { return rankVotes(this.countVotes('mapVote'), this.props.maps).slice(0, 2) }, selectedServer() { return rankVotes(this.countVotes('serverVote'), this.props.servers).slice(0, 1); }, render() { let maps = this.selectedMaps(); let server = this.selectedServer().pop(); let password; if (server.password) { password = [
Password
,
{server.password}
]; } return (
Server
Maps
{maps.map(map => map.name).join(" & ")}
Server
{server.name}
Address
{server.ip}:{server.port}
{password}

Join Server

); } }); var ArchivedGathers = React.createClass({ render() { let archive = this.props.archive .sort((a, b) => { return new Date(b.createdAt) - new Date(a.createdAt); }) .map((archivedGather, index) => { return }); return (
Archived Gathers
{archive}
); } });