| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | 
							- <template>
 
- 	<div>
 
- 		<div class="container">
 
- 			<table class="table is-striped">
 
- 				<thead>
 
- 					<tr>
 
- 						<td>Type</td>
 
- 						<td>Value</td>
 
- 						<td>Reason</td>
 
- 						<td>Status</td>
 
- 						<td>Options</td>
 
- 					</tr>
 
- 				</thead>
 
- 				<tbody>
 
- 					<tr
 
- 						v-for="(punishment, index) in sortedPunishments"
 
- 						:key="index"
 
- 					>
 
- 						<td v-if="punishment.type === 'banUserId'">
 
- 							User ID
 
- 						</td>
 
- 						<td v-else>
 
- 							IP Address
 
- 						</td>
 
- 						<td>{{ punishment.value }}</td>
 
- 						<td>{{ punishment.reason }}</td>
 
- 						<td>
 
- 							{{
 
- 								punishment.active &&
 
- 								new Date(punishment.expiresAt).getTime() >
 
- 									Date.now()
 
- 									? "Active"
 
- 									: "Inactive"
 
- 							}}
 
- 						</td>
 
- 						<td>
 
- 							<button
 
- 								class="button is-primary"
 
- 								@click="view(punishment)"
 
- 							>
 
- 								View
 
- 							</button>
 
- 						</td>
 
- 					</tr>
 
- 				</tbody>
 
- 			</table>
 
- 			<div class="card is-fullwidth">
 
- 				<header class="card-header">
 
- 					<p class="card-header-title">
 
- 						Ban an IP
 
- 					</p>
 
- 				</header>
 
- 				<div class="card-content">
 
- 					<div class="content">
 
- 						<label class="label">Expires In</label>
 
- 						<select v-model="ipBan.expiresAt">
 
- 							<option value="1h">
 
- 								1 Hour
 
- 							</option>
 
- 							<option value="12h">
 
- 								12 Hours
 
- 							</option>
 
- 							<option value="1d">
 
- 								1 Day
 
- 							</option>
 
- 							<option value="1w">
 
- 								1 Week
 
- 							</option>
 
- 							<option value="1m">
 
- 								1 Month
 
- 							</option>
 
- 							<option value="3m">
 
- 								3 Months
 
- 							</option>
 
- 							<option value="6m">
 
- 								6 Months
 
- 							</option>
 
- 							<option value="1y">
 
- 								1 Year
 
- 							</option>
 
- 						</select>
 
- 						<label class="label">IP</label>
 
- 						<p class="control is-expanded">
 
- 							<input
 
- 								v-model="ipBan.ip"
 
- 								class="input"
 
- 								type="text"
 
- 								placeholder="IP address (xxx.xxx.xxx.xxx)"
 
- 							/>
 
- 						</p>
 
- 						<label class="label">Reason</label>
 
- 						<p class="control is-expanded">
 
- 							<input
 
- 								v-model="ipBan.reason"
 
- 								class="input"
 
- 								type="text"
 
- 								placeholder="Reason"
 
- 							/>
 
- 						</p>
 
- 					</div>
 
- 				</div>
 
- 				<footer class="card-footer">
 
- 					<a class="card-footer-item" v-on:click="banIP()" href="#"
 
- 						>Ban IP</a
 
- 					>
 
- 				</footer>
 
- 			</div>
 
- 		</div>
 
- 		<view-punishment v-if="modals.viewPunishment" />
 
- 	</div>
 
- </template>
 
- <script>
 
- import { mapState, mapActions } from "vuex";
 
- import { Toast } from "vue-roaster";
 
- import ViewPunishment from "../Modals/ViewPunishment.vue";
 
- import io from "../../io";
 
- export default {
 
- 	components: { ViewPunishment },
 
- 	data() {
 
- 		return {
 
- 			punishments: [],
 
- 			ipBan: {
 
- 				expiresAt: "1h"
 
- 			}
 
- 		};
 
- 	},
 
- 	computed: {
 
- 		sortedPunishments() {
 
- 			//   return _.orderBy(this.punishments, -1);
 
- 			return this.punishments;
 
- 		},
 
- 		...mapState("modals", {
 
- 			modals: state => state.modals.admin
 
- 		})
 
- 	},
 
- 	methods: {
 
- 		view(punishment) {
 
- 			this.viewPunishment(punishment);
 
- 			this.openModal({ sector: "admin", modal: "viewPunishment" });
 
- 		},
 
- 		banIP() {
 
- 			const _this = this;
 
- 			_this.socket.emit(
 
- 				"punishments.banIP",
 
- 				_this.ipBan.ip,
 
- 				_this.ipBan.reason,
 
- 				_this.ipBan.expiresAt,
 
- 				res => {
 
- 					Toast.methods.addToast(res.message, 6000);
 
- 				}
 
- 			);
 
- 		},
 
- 		init() {
 
- 			const _this = this;
 
- 			_this.socket.emit("punishments.index", res => {
 
- 				if (res.status === "success") _this.punishments = res.data;
 
- 			});
 
- 			// _this.socket.emit('apis.joinAdminRoom', 'punishments', () => {});
 
- 		},
 
- 		...mapActions("modals", ["openModal"]),
 
- 		...mapActions("admin/punishments", ["viewPunishment"])
 
- 	},
 
- 	mounted() {
 
- 		const _this = this;
 
- 		io.getSocket(socket => {
 
- 			_this.socket = socket;
 
- 			if (_this.socket.connected) _this.init();
 
- 			io.onConnect(() => _this.init());
 
- 		});
 
- 	}
 
- };
 
- </script>
 
- <style lang="scss" scoped>
 
- body {
 
- 	font-family: "Roboto", sans-serif;
 
- }
 
- td {
 
- 	vertical-align: middle;
 
- }
 
- select {
 
- 	margin-bottom: 10px;
 
- }
 
- </style>
 
 
  |