This commit is contained in:
		| @@ -4,6 +4,7 @@ import wAnalogClock from './analog-clock.vue'; | ||||
| import wVersion from './version.vue'; | ||||
| import wRss from './rss.vue'; | ||||
| import wServer from './server.vue'; | ||||
| import wPostsMonitor from './posts-monitor.vue'; | ||||
| import wMemo from './memo.vue'; | ||||
| import wBroadcast from './broadcast.vue'; | ||||
| import wCalendar from './calendar.vue'; | ||||
| @@ -22,6 +23,7 @@ Vue.component('mkw-tips', wTips); | ||||
| Vue.component('mkw-donation', wDonation); | ||||
| Vue.component('mkw-broadcast', wBroadcast); | ||||
| Vue.component('mkw-server', wServer); | ||||
| Vue.component('mkw-posts-monitor', wPostsMonitor); | ||||
| Vue.component('mkw-memo', wMemo); | ||||
| Vue.component('mkw-rss', wRss); | ||||
| Vue.component('mkw-version', wVersion); | ||||
|   | ||||
							
								
								
									
										182
									
								
								src/client/app/common/views/widgets/posts-monitor.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								src/client/app/common/views/widgets/posts-monitor.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| <template> | ||||
| <div class="mkw-posts-monitor"> | ||||
| 	<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2"> | ||||
| 		<template slot="header">%fa:chart-line%%i18n:@title%</template> | ||||
| 		<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button> | ||||
|  | ||||
| 		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode"> | ||||
| 			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2"> | ||||
| 				<defs> | ||||
| 					<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0"> | ||||
| 						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> | ||||
| 						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> | ||||
| 					</linearGradient> | ||||
| 					<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> | ||||
| 						<polyline | ||||
| 							:points="fediPolylinePoints" | ||||
| 							fill="none" | ||||
| 							stroke="#fff" | ||||
| 							stroke-width="1"/> | ||||
| 					</mask> | ||||
| 				</defs> | ||||
| 				<rect | ||||
| 					x="-1" y="-1" | ||||
| 					:width="viewBoxX + 2" :height="viewBoxY + 2" | ||||
| 					:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/> | ||||
| 				<text x="1" y="5">Fedi</text> | ||||
| 			</svg> | ||||
| 			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1"> | ||||
| 				<defs> | ||||
| 					<linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0"> | ||||
| 						<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> | ||||
| 						<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> | ||||
| 					</linearGradient> | ||||
| 					<mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> | ||||
| 						<polyline | ||||
| 							:points="localPolylinePoints" | ||||
| 							fill="none" | ||||
| 							stroke="#fff" | ||||
| 							stroke-width="1"/> | ||||
| 					</mask> | ||||
| 				</defs> | ||||
| 				<rect | ||||
| 					x="-1" y="-1" | ||||
| 					:width="viewBoxX + 2" :height="viewBoxY + 2" | ||||
| 					:style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/> | ||||
| 				<text x="1" y="5">Local</text> | ||||
| 			</svg> | ||||
| 		</div> | ||||
| 	</mk-widget-container> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import define from '../../../common/define-widget'; | ||||
| import * as uuid from 'uuid'; | ||||
|  | ||||
| export default define({ | ||||
| 	name: 'server', | ||||
| 	props: () => ({ | ||||
| 		design: 0, | ||||
| 		view: 0 | ||||
| 	}) | ||||
| }).extend({ | ||||
| 	data() { | ||||
| 		return { | ||||
| 			connection: null, | ||||
| 			connectionId: null, | ||||
| 			viewBoxY: 30, | ||||
| 			stats: [], | ||||
| 			fediGradientId: uuid(), | ||||
| 			fediMaskId: uuid(), | ||||
| 			localGradientId: uuid(), | ||||
| 			localMaskId: uuid(), | ||||
| 			fediPolylinePoints: '', | ||||
| 			localPolylinePoints: '', | ||||
| 			fediPolygonPoints: '', | ||||
| 			localPolygonPoints: '' | ||||
| 		}; | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		viewBoxX(): number { | ||||
| 			return this.props.view == 0 ? 50 : 100; | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		viewBoxX() { | ||||
| 			this.draw(); | ||||
| 		} | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		this.connection = (this as any).os.streams.notesStatsStream.getConnection(); | ||||
| 		this.connectionId = (this as any).os.streams.notesStatsStream.use(); | ||||
|  | ||||
| 		this.connection.on('stats', this.onStats); | ||||
| 		this.connection.on('statsLog', this.onStatsLog); | ||||
| 		this.connection.send({ | ||||
| 			type: 'requestLog', | ||||
| 			id: Math.random().toString() | ||||
| 		}); | ||||
| 	}, | ||||
| 	beforeDestroy() { | ||||
| 		this.connection.off('stats', this.onStats); | ||||
| 		this.connection.off('statsLog', this.onStatsLog); | ||||
| 		(this as any).os.streams.notesStatsStream.dispose(this.connectionId); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		toggle() { | ||||
| 			if (this.props.view == 2) { | ||||
| 				this.props.view = 0; | ||||
| 			} else { | ||||
| 				this.props.view++; | ||||
| 			} | ||||
| 			this.save(); | ||||
| 		}, | ||||
| 		func() { | ||||
| 			if (this.props.design == 2) { | ||||
| 				this.props.design = 0; | ||||
| 			} else { | ||||
| 				this.props.design++; | ||||
| 			} | ||||
| 			this.save(); | ||||
| 		}, | ||||
| 		draw() { | ||||
| 			const stats = this.props.view == 0 ? this.stats.slice(0, 50) : this.stats; | ||||
| 			const fediPeak = Math.max.apply(null, this.stats.map(x => x.all)) || 1; | ||||
| 			const localPeak = Math.max.apply(null, this.stats.map(x => x.local)) || 1; | ||||
|  | ||||
| 			this.fediPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' '); | ||||
| 			this.localPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' '); | ||||
|  | ||||
| 			this.fediPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; | ||||
| 			this.localPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; | ||||
| 		}, | ||||
| 		onStats(stats) { | ||||
| 			this.stats.push(stats); | ||||
| 			if (this.stats.length > 100) this.stats.shift(); | ||||
| 			this.draw(); | ||||
| 		}, | ||||
| 		onStatsLog(statsLog) { | ||||
| 			statsLog.forEach(stats => this.onStats(stats)); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| root(isDark) | ||||
| 	&.dual | ||||
| 		> svg | ||||
| 			width 50% | ||||
| 			float left | ||||
|  | ||||
| 			&:first-child | ||||
| 				padding-right 5px | ||||
|  | ||||
| 			&:last-child | ||||
| 				padding-left 5px | ||||
|  | ||||
| 	> svg | ||||
| 		display block | ||||
| 		padding 10px | ||||
| 		width 100% | ||||
|  | ||||
| 		> text | ||||
| 			font-size 5px | ||||
| 			fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55) | ||||
|  | ||||
| 			> tspan | ||||
| 				opacity 0.5 | ||||
|  | ||||
| 	&:after | ||||
| 		content "" | ||||
| 		display block | ||||
| 		clear both | ||||
|  | ||||
| .qpdmibaztplkylerhdbllwcokyrfxeyj[data-darkmode] | ||||
| 	root(true) | ||||
|  | ||||
| .qpdmibaztplkylerhdbllwcokyrfxeyj:not([data-darkmode]) | ||||
| 	root(false) | ||||
|  | ||||
| </style> | ||||
| @@ -55,11 +55,11 @@ export default define({ | ||||
| 			this.fetching = false; | ||||
| 		}); | ||||
|  | ||||
| 		this.connection = (this as any).os.streams.serverStream.getConnection(); | ||||
| 		this.connectionId = (this as any).os.streams.serverStream.use(); | ||||
| 		this.connection = (this as any).os.streams.serverStatsStream.getConnection(); | ||||
| 		this.connectionId = (this as any).os.streams.serverStatsStream.use(); | ||||
| 	}, | ||||
| 	beforeDestroy() { | ||||
| 		(this as any).os.streams.serverStream.dispose(this.connectionId); | ||||
| 		(this as any).os.streams.serverStatsStream.dispose(this.connectionId); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		toggle() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo