Commit 3136f8a5 authored by nanahira's avatar nanahira

Merge branch 'v3' into v3-m1mac

parents 83cd317f 7026934b
#!/bin/bash
set -x
set -o errexit
if [[ -z "$CI_COMMIT_TAG" ]]; then
export TRAVIS_BRANCH="_no_notarize"
fi
npm ci
npm run dist
#!/bin/bash
set -o errexit
BUNDLE_ID="com.mycard.mycard"
APP_PATH=$(ls -1 dist/*.dmg | head -n 1)
xcrun altool --notarize-app --primary-bundle-id "$BUNDLE_ID" --username "$MACOS_NOTARIZE_USERNAME" --password "$MACOS_NOTARIZE_PASSWORD" --asc-provider "$MACOS_ASC_PROVIDER" -t osx --file "$APP_PATH"
...@@ -14,9 +14,8 @@ macOS_bin: ...@@ -14,9 +14,8 @@ macOS_bin:
paths: paths:
- bin - bin
script: script:
- mkdir -p bin; curl --location --retry - mkdir -p bin
5 https://github.com/aria2/aria2/releases/download/release-1.29.0/aria2-1.29.0-osx-darwin.tar.bz2 - curl --location --retry 5 https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-osx-darwin.tar.bz2 | tar --strip-components=2 -C bin -jxf - aria2-1.35.0/bin/aria2c
| tar --strip-components=2 -C bin -jxf - aria2-1.29.0/bin/aria2c
windows_bin: windows_bin:
stage: prepare stage: prepare
...@@ -27,13 +26,14 @@ windows_bin: ...@@ -27,13 +26,14 @@ windows_bin:
- bin - bin
script: script:
- mkdir -p bin - mkdir -p bin
- curl --location --retry 5 --output aria2-1.29.0-win-32bit-build1.zip https://github.com/aria2/aria2/releases/download/release-1.29.0/aria2-1.29.0-win-32bit-build1.zip #- wget https://cdn01.moecube.com/ygopro-build-materials/mycard-binaries.zip
- unzip -o aria2-1.29.0-win-32bit-build1.zip aria2-1.29.0-win-32bit-build1/aria2c.exe #- 7z x -y mycard-binaries.zip
- mv aria2-1.29.0-win-32bit-build1/aria2c.exe bin - curl --location --retry 5 --output aria2-1.35.0-win-32bit-build1.zip https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-win-32bit-build1.zip
- rm -rf aria2-1.29.0-win-32bit-build1 aria2-1.29.0-win-32bit-build1.zip - unzip -o aria2-1.35.0-win-32bit-build1.zip aria2-1.35.0-win-32bit-build1/aria2c.exe
- mv aria2-1.35.0-win-32bit-build1/aria2c.exe bin
- rm -rf aria2-1.35.0-win-32bit-build1 aria2-1.35.0-win-32bit-build1.zip
- curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/i686/bsdtar-3.4.2-2-i686.pkg.tar.xz" | tar --strip-components=2 -C bin -Jxf - usr/bin/bsdtar.exe - curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/i686/bsdtar-3.4.2-2-i686.pkg.tar.xz" | tar --strip-components=2 -C bin -Jxf - usr/bin/bsdtar.exe
- curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/Base/i686/msys2-base-i686-20161025.tar.xz" | tar --strip-components=3 -C bin -Jxf - msys32/usr/bin/msys-2.0.dll msys32/usr/bin/msys-bz2-1.dll msys32/usr/bin/msys-gcc_s-1.dll msys32/usr/bin/msys-iconv-2.dll msys32/usr/bin/msys-lzma-5.dll msys32/usr/bin/msys-lzo2-2.dll msys32/usr/bin/msys-nettle-6.dll msys32/usr/bin/msys-xml2-2.dll msys32/usr/bin/msys-z.dll msys32/usr/bin/sha256sum.exe msys32/usr/bin/msys-intl-8.dll - curl --location --retry 5 "http://downloads.sourceforge.net/project/msys2/Base/i686/msys2-base-i686-20200517.tar.xz" | tar --strip-components=3 -C bin -Jxf - msys32/usr/bin/msys-2.0.dll msys32/usr/bin/msys-bz2-1.dll msys32/usr/bin/msys-expat-1.dll msys32/usr/bin/msys-gcc_s-1.dll msys32/usr/bin/msys-iconv-2.dll msys32/usr/bin/msys-lz4-1.dll msys32/usr/bin/msys-lzma-5.dll msys32/usr/bin/msys-z.dll msys32/usr/bin/msys-zstd-1.dll msys32/usr/bin/sha256sum.exe
windows: windows:
stage: build stage: build
...@@ -70,14 +70,24 @@ macOS: ...@@ -70,14 +70,24 @@ macOS:
variables: variables:
CSC_KEY_PASSWORD: $MACOS_CSC_KEY_PASSWORD CSC_KEY_PASSWORD: $MACOS_CSC_KEY_PASSWORD
CSC_LINK: $MACOS_CSC_LINK CSC_LINK: $MACOS_CSC_LINK
script: APPLE_ID: $MACOS_NOTARIZE_USERNAME
- npm ci APPLE_ID_PASSWORD: $MACOS_NOTARIZE_PASSWORD
- npm run dist TEAM_SHORT_NAME: $MACOS_ASC_PROVIDER
#- ls -la dist script: ./.ci/macos-build.sh
artifacts: artifacts:
paths: paths:
- dist/ - dist/
#macOS_notarize:
# stage: deploy
# dependencies:
# - macOS
# tags:
# - macOS
# script: ./.ci/macos-notarize.sh
# only:
# - tags
upload_to_minio: upload_to_minio:
stage: deploy stage: deploy
dependencies: dependencies:
...@@ -90,4 +100,4 @@ upload_to_minio: ...@@ -90,4 +100,4 @@ upload_to_minio:
- aws s3 --endpoint=https://minio.mycard.moe:9000 sync dist/ s3://mycard/downloads - aws s3 --endpoint=https://minio.mycard.moe:9000 sync dist/ s3://mycard/downloads
only: only:
- tags - tags
- v3 #- v3
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
<div class="panel" id="game_info"> <div class="panel" id="game_info">
<p [innerHTML]="currentApp.description"></p> <p [innerHTML]="currentApp.description"></p>
<div id="tags" *ngIf="currentApp.tags"> <div id="tags" *ngIf="currentApp.tags">
<div *ngFor="let tag of currentApp.tags" class="btn btn-sm btn-danger tag">{{tags[tag] || tag}}</div> <div *ngFor="let tag of currentApp.tags" class="btn btn-sm btn-info tag">{{tags[tag] || tag}}</div>
</div> </div>
</div> </div>
<div class="panel" id="game_info_2"> <div class="panel" id="game_info_2">
...@@ -133,6 +133,9 @@ ...@@ -133,6 +133,9 @@
<dt i18n>发行日期</dt> <dt i18n>发行日期</dt>
<dd>{{currentApp.released_at | date:'mediumDate'}}</dd> <dd>{{currentApp.released_at | date:'mediumDate'}}</dd>
<dt i18n *ngIf="currentApp.updated_at">更新日期</dt>
<dd *ngIf="currentApp.updated_at">{{currentApp.updated_at | date:'mediumDate'}}</dd>
</dl> </dl>
</div> </div>
</div> </div>
......
...@@ -58,6 +58,7 @@ export class App { ...@@ -58,6 +58,7 @@ export class App {
homepage: string; homepage: string;
developers: { name: string, url: string }[]; developers: { name: string, url: string }[];
released_at: Date; released_at: Date;
updated_at: Date;
category: Category; category: Category;
parent?: App; parent?: App;
...@@ -167,6 +168,7 @@ export class App { ...@@ -167,6 +168,7 @@ export class App {
this.description = app.description; this.description = app.description;
this.developers = app.developers; this.developers = app.developers;
this.released_at = app.released_at; this.released_at = app.released_at;
this.updated_at = app.updated_at;
this.author = app.author; this.author = app.author;
this.homepage = app.homepage; this.homepage = app.homepage;
this.category = Category[<string>app.category]; this.category = Category[<string>app.category];
......
...@@ -84,7 +84,9 @@ export class AppsService { ...@@ -84,7 +84,9 @@ export class AppsService {
let appsURL = 'https://api.mycard.moe/apps.json'; let appsURL = 'https://api.mycard.moe/apps.json';
let keysURL = 'https://api.mycard.moe/keys'; let keysURL = 'https://api.mycard.moe/keys';
try { try {
let data = await this.http.get(appsURL).map((response) => response.json()).toPromise(); let data = await this.http.get(appsURL)
.timeout(5000)
.map((response) => response.json()).toPromise();
let keys_data = await this.http.get(keysURL, { let keys_data = await this.http.get(keysURL, {
search: { search: {
user_id: this.loginService.user.email user_id: this.loginService.user.email
...@@ -102,6 +104,7 @@ export class AppsService { ...@@ -102,6 +104,7 @@ export class AppsService {
console.error(e); console.error(e);
let data = localStorage.getItem('apps_json'); let data = localStorage.getItem('apps_json');
if (data) { if (data) {
new Notification('MyCard', {body: '读取最新游戏列表失败...'});
this.apps = this.loadAppsList(JSON.parse(data!)); this.apps = this.loadAppsList(JSON.parse(data!));
} else { } else {
alert('读取游戏列表失败,可能是网络不通'); alert('读取游戏列表失败,可能是网络不通');
...@@ -278,6 +281,9 @@ export class AppsService { ...@@ -278,6 +281,9 @@ export class AppsService {
if (app.released_at) { if (app.released_at) {
app.released_at = new Date(app.released_at); app.released_at = new Date(app.released_at);
} }
if (app.updated_at) {
app.updated_at = new Date(app.updated_at);
}
if (app.news) { if (app.news) {
for (let item of app.news) { for (let item of app.news) {
item.updated_at = new Date(item.updated_at); item.updated_at = new Date(item.updated_at);
......
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" /> <link href="../node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style> <style>
@font-face { @font-face {
font-family: 'Mogra'; font-family: 'Mogra';
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
src: url('font/Mogra-Regular.ttf'); src: url('../font/Mogra-Regular.ttf');
} }
html,div,body,td,tr{ html,div,body,td,tr{
background: rgba(0,0,0,0); background: rgba(0,0,0,0);
......
...@@ -36,7 +36,7 @@ let data_str = data_url.get('data'); ...@@ -36,7 +36,7 @@ let data_str = data_url.get('data');
let data = JSON.parse(data_str!); let data = JSON.parse(data_str!);
let titleStr; let titleStr;
let icon = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.myname + '/25/1.png'; let icon = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.myname + '/120/1.png';
let myMame = data.myname; let myMame = data.myname;
let winTimes, loseTimes, rank, rank_up, DP, DP_up, DP_up_sum, EXP, EXP_up; let winTimes, loseTimes, rank, rank_up, DP, DP_up, DP_up_sum, EXP, EXP_up;
let winOrLose = 0; let winOrLose = 0;
......
...@@ -59,7 +59,7 @@ span { ...@@ -59,7 +59,7 @@ span {
height: 1em; height: 1em;
width: 1em; width: 1em;
float: right; float: right;
margin: 14px; margin: 5px;
position: relative; position: relative;
} }
...@@ -114,7 +114,7 @@ span { ...@@ -114,7 +114,7 @@ span {
} }
.fa-spin { .fa-spin {
margin: 14px; margin: 5px;
color: #0275d8; color: #0275d8;
font-weight: bold; font-weight: bold;
float: right; float: right;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<nav id="apps" *ngIf="apps" class="bg-faded sidebar scroll"> <nav id="apps" *ngIf="apps" class="bg-faded sidebar scroll">
<div id="search" class="input-group"> <div id="search" class="input-group">
<i class="fa fa-search input-group-addon search" id="basic-addon1"></i> <i class="fa fa-search input-group-addon search" id="basic-addon1"></i>
<input #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1"> <input i18n-placeholder #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1">
</div> </div>
<span i18n *ngIf="grouped_apps.installed">已安装</span> <span i18n *ngIf="grouped_apps.installed">已安装</span>
......
...@@ -71,6 +71,11 @@ lobby[hidden], webview[hidden] { ...@@ -71,6 +71,11 @@ lobby[hidden], webview[hidden] {
text-align: center; text-align: center;
} }
#navbar-brand img {
width: 24px;
margin-top: -5px;
}
#navbar .nav-link { #navbar .nav-link {
font-size: 18px; font-size: 18px;
color: #a7a7a7; color: #a7a7a7;
...@@ -91,4 +96,8 @@ lobby[hidden], webview[hidden] { ...@@ -91,4 +96,8 @@ lobby[hidden], webview[hidden] {
#navbar { #navbar {
z-index: 100; z-index: 100;
}
#settings-modal .modal-dialog {
margin-top: 50px;
} }
\ No newline at end of file
<nav id="navbar" class="navbar navbar-toggleable-md navbar-light"> <nav id="navbar" class="navbar navbar-toggleable-md navbar-light">
<a id="navbar-brand" class="navbar-brand" href="#">MyCard</a> <a id="navbar-brand" class="navbar-brand" href="#">
<img src="images/icon.ico" /> MyCard
</a>
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav mr-auto">
<li *ngIf="!loginService.logged_in" class="nav-item active"> <li *ngIf="!loginService.logged_in" class="nav-item active">
<a i18n class="nav-link" href="#">登录</a> <a i18n class="nav-link" href="#">登录</a>
......
...@@ -8,6 +8,7 @@ import { SettingsService } from './settings.sevices'; ...@@ -8,6 +8,7 @@ import { SettingsService } from './settings.sevices';
window['Tether'] = Tether; window['Tether'] = Tether;
const autoUpdater: Electron.AutoUpdater = remote.getGlobal('autoUpdater'); const autoUpdater: Electron.AutoUpdater = remote.getGlobal('autoUpdater');
const konami_code_logger: string[] = [];
@Component({ @Component({
moduleId: module.id, moduleId: module.id,
...@@ -48,6 +49,22 @@ export class MyCardComponent implements OnInit { ...@@ -48,6 +49,22 @@ export class MyCardComponent implements OnInit {
'update-available': this.update_available, 'update-available': this.update_available,
'update-downloaded': this.update_downloaded 'update-downloaded': this.update_downloaded
})); }));
$('#settings-modal').on('keyup',(event)=>{
konami_code_logger.unshift(event.key);
if (konami_code_logger[9] == 'ArrowUp'
&& konami_code_logger[8] == 'ArrowUp'
&& konami_code_logger[7] == 'ArrowDown'
&& konami_code_logger[6] == 'ArrowDown'
&& konami_code_logger[5] == 'ArrowLeft'
&& konami_code_logger[4] == 'ArrowRight'
&& konami_code_logger[3] == 'ArrowLeft'
&& konami_code_logger[2] == 'ArrowRight'
&& konami_code_logger[1].toLowerCase() == 'b'
&& konami_code_logger[0].toLowerCase() == 'a'
) {
this.currentWindow.webContents.openDevTools();
}
});
// document.addEventListener('drop', (event)=>{ // document.addEventListener('drop', (event)=>{
// console.log('drop', event); // console.log('drop', event);
// event.preventDefault(); // event.preventDefault();
...@@ -120,6 +137,7 @@ export class MyCardComponent implements OnInit { ...@@ -120,6 +137,7 @@ export class MyCardComponent implements OnInit {
remote.app.relaunch(); remote.app.relaunch();
remote.app.quit(); remote.app.quit();
} }
$('#settings-modal').modal('hide');
} }
// //
......
...@@ -18,6 +18,9 @@ import { CandyComponent } from './candy.component'; ...@@ -18,6 +18,9 @@ import { CandyComponent } from './candy.component';
import { RavenErrorHandler } from './error-handler'; import { RavenErrorHandler } from './error-handler';
import { NetworkComponent } from './network.component'; import { NetworkComponent } from './network.component';
export function settingsService_getLocale(settingsService: SettingsService) {
return settingsService.getLocale();
}
@NgModule({ @NgModule({
imports: [BrowserModule, FormsModule, ReactiveFormsModule, HttpModule], imports: [BrowserModule, FormsModule, ReactiveFormsModule, HttpModule],
...@@ -31,7 +34,7 @@ import { NetworkComponent } from './network.component'; ...@@ -31,7 +34,7 @@ import { NetworkComponent } from './network.component';
, { , {
provide: LOCALE_ID, provide: LOCALE_ID,
deps: [SettingsService], deps: [SettingsService],
useFactory: (settingsService: SettingsService) => settingsService.getLocale() useFactory: settingsService_getLocale
} }
// , { // , {
// provide: ErrorHandler, useClass: RavenErrorHandler // provide: ErrorHandler, useClass: RavenErrorHandler
......
...@@ -50,23 +50,6 @@ ...@@ -50,23 +50,6 @@
/*border-bottom: none;*/ /*border-bottom: none;*/
/*}*/ /*}*/
/*!*fixme: auto width*!*/
/*#game-list-modal .title {*/
/*width: 25%;*/
/*}*/
/*#game-list-modal .users {*/
/*width: 20%;*/
/*}*/
/*#game-list-modal .mode {*/
/*width: 20%;*/
/*}*/
/*#game-list-modal .extra {*/
/*width: 35%;*/
/*}*/
/*.float-left {*/ /*.float-left {*/
/*float: left;*/ /*float: left;*/
/*}*/ /*}*/
...@@ -104,6 +87,17 @@ form { ...@@ -104,6 +87,17 @@ form {
display: block; display: block;
} }
#game-create-windbot .modal-body {
max-height: 400px;
overflow-y: auto;
}
#game-replay-modal .modal-dialog,
#game-create-windbot .modal-dialog,
#game-list-modal .modal-dialog {
margin-top: 50px;
}
#game-list-modal .modal-content { #game-list-modal .modal-content {
flex-direction: row; flex-direction: row;
} }
...@@ -185,13 +179,81 @@ form { ...@@ -185,13 +179,81 @@ form {
} }
#game-replay-watch { #game-replay-watch {
height: 500px; height: 480px;
} }
#game-replay-watch table { #game-replay-watch table {
font-size: 14px; font-size: 14px;
} }
#game-replay-watch th.mode {
width: 15%;
}
#game-replay-watch th.users {
width: 15%;
}
#game-replay-watch th.extra {
width: 20%;
}
#game-list th.users {
width: 20%;
}
#game-list th.mode {
width: 15%;
}
#game-list th.extra {
width: 35%;
}
#game-list td.users,
#game-list td.extra,
#game-replay-watch td.title,
#game-replay-watch td.users,
#game-replay-watch td.extra {
overflow-x: hidden;
white-space: nowrap;
}
#game-list td.users {
max-width: 95px;
}
#game-list td.extra {
max-width: 185px;
}
#game-replay-watch td.title {
max-width: 360px;
}
#game-replay-watch td.users {
max-width: 90px;
}
#game-replay-watch td.extra {
max-width: 120px;
}
#game-list td.extra span,
#game-replay-watch td.extra span {
margin-left: -2px;
padding-right: 2px;
border-right: 1px solid #999;
}
#game-list td.extra span:first-child,
#game-replay-watch td.extra span:first-child {
margin-left: 0;
}
#game-list td.extra span:last-child,
#game-replay-watch td.extra span:last-child {
padding-right: 0;
border-right: none;
}
#game-replay-watch .avatar { #game-replay-watch .avatar {
width: 18px; width: 18px;
height: 18px; height: 18px;
......
This diff is collapsed.
...@@ -69,6 +69,7 @@ interface Options { ...@@ -69,6 +69,7 @@ interface Options {
mode: number; mode: number;
rule: number; rule: number;
start_lp: number; start_lp: number;
start_lp_tag: number;
start_hand: number; start_hand: number;
draw_count: number; draw_count: number;
enable_priority: boolean; enable_priority: boolean;
...@@ -137,6 +138,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -137,6 +138,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
mode: 1, mode: 1,
rule: this.settingsService.getLocale().startsWith('zh') ? 0 : 1, rule: this.settingsService.getLocale().startsWith('zh') ? 0 : 1,
start_lp: 8000, start_lp: 8000,
start_lp_tag: 16000,
start_hand: 5, start_hand: 5,
draw_count: 1, draw_count: 1,
enable_priority: false, enable_priority: false,
...@@ -386,6 +388,23 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -386,6 +388,23 @@ export class YGOProComponent implements OnInit, OnDestroy {
this.replay_connections = []; this.replay_connections = [];
}); });
let watchDropdownMenu = $('#watch-filter');
watchDropdownMenu.on("change", "input[type='checkbox']", (event) => {
//$(event.target).closest("label").toggleClass("active", (<HTMLInputElement> event.target).checked);
this.refresh_replay_rooms();
});
replay_modal.on('click', (event) => {
if (!watchDropdownMenu.is(event.target) && !watchDropdownMenu.has(event.target).length) {
watchDropdownMenu.removeClass('show');
}
});
$('#watchDropdownMenuButton').on('click', () => {
watchDropdownMenu.toggleClass('show');
});
remote.ipcMain.on('YGOPro', (e: any, type: string) => { remote.ipcMain.on('YGOPro', (e: any, type: string) => {
console.log('rrrrr'); console.log('rrrrr');
this.request_match(type); this.request_match(type);
...@@ -602,7 +621,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -602,7 +621,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
data.exp_rank_ex = exp_rank_ex; data.exp_rank_ex = exp_rank_ex;
data.arena_rank_ex = arena_rank_ex; data.arena_rank_ex = arena_rank_ex;
if (start_time !== data.start_time) { if (start_time !== data.start_time) {
this.appsService.showResult('end_YGOPro_single.html', data, 202, 222); this.appsService.showResult('app/end_YGOPro_single.html', data, 202, 222);
} }
}); });
} catch (error) { } catch (error) {
...@@ -797,4 +816,11 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -797,4 +816,11 @@ export class YGOProComponent implements OnInit, OnDestroy {
// this.youtube.nativeElement.src = 'https://m.youtube.com/results?search_query=YGOPro'; // this.youtube.nativeElement.src = 'https://m.youtube.com/results?search_query=YGOPro';
// shell.openExternal(event.url); // shell.openExternal(event.url);
// } // }
avatar_fallback(event) {
if (!event.target.getAttribute('fallback')) {
event.target.src = "images/noavatar.png";
event.target.setAttribute('fallback', true);
}
}
} }
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style>
html,div,body,td,tr{
background: rgba(0,0,0,0);
font-size:14px;
font-family:-apple-system, Arial, 'Source Sans Pro', "Microsoft YaHei", 'Microsoft JhengHei', "WenQuanYi Micro Hei", sans-serif;
padding:0;
margin:0;
color:#00a4d9;
}
i:hover{
color:#0b88b1;
}
td{
text-align:center;
width:50px;
height:20px;
line-height: 20px;
padding:2px;
}
td:nth-child(1){
width:auto;
}
td:nth-child(2){
text-align:left;
width:150px
}
img{
display: block;
height: 100%;
}
.window{
position:relative;
width:320px;
height:180px;
background:linear-gradient(to bottom, #bfcdd2, rgba(218, 218, 218, 0.17));
padding:5px;
}
.myIcon{
float:left;
height:100%
}
.close{
position:absolute;
top:5px;
right:5px
}
.title{
/*display: table;*/
height:50px;
line-height:30px;
padding:5px;
border-bottom:1px #fff solid;
color:#00a4d9
}
.winOrLose{
font-size:30px;
display:table-cell;
vertical-align:middle;
padding-right:10px;
display: none;
}
.myInfo_tr{background:linear-gradient(to right, rgba(255,255,255,1), rgba(255,255,255,0.5));}
#myName{
height:50%;
line-height:100%;
font-size:25px;
}
#myScore{font-size:25px; padding-right: 10px}
#myExp{font-size:15px; color:green; padding-right: 10px}
#myGold{font-size:15px; color:#ec6d20; padding-right: 10px}
#win{color:green;}
#lose{color:red;}
#users_info{border-collapse:collapse;}
</style>
</head>
<body>
<div class="window">
<i onclick="window.opener=null;window.close();" class="fa fa-times close" title="关闭"></i>
<div class="title">
<div class="myIcon">
<img id="myIcon" >
</div>
<div style="float:left; padding-left:10px">
<div id="myName"></div>
<div style="height:50%;">
<span id="myScore"></span>
<span id="myExp"></span>
<span id="myGold"></span>
</div>
</div>
<div style="height:100%; float:right; display:table;">
<span id="win" class="winOrLose"></span>
<span id="lose" class="winOrLose"></span>
</div>
</div>
<div class="clear:both"></div>
<div style="padding:5px;">
<table id="users_info">
<tr>
<th colspan="2">玩家</th>
<th>评价</th>
<th>经验</th>
<th>金币</th>
</tr>
</table>
</div>
</div>
<script>
window.exports = {}
</script>
<script src="end.js"></script>
</body>
</html>
/**
* Created by break on 2017/6/9.
*/
import * as $ from 'jquery';
let data_url = (new URL(document.location.toString())).searchParams;
let data_str = data_url.get('data');
console.log(data_str);
// data={
// 'win':true,
// 'users_info':[{
// 'isPlay':true,
// 'icon':'http://himg.bdimg.com/sys/portrait/item/55c177633531343132333435f20c.jpg',
// 'name':'刘大耳',
// 'score':'5555',
// 'exp':'123',
// 'gold':'321'
// },{
// 'isPlay':false,
// 'icon':'http://himg.bdimg.com/sys/portrait/item/55c177633531343132333435f20c.jpg',
// 'name':'关绿帽',
// 'score':'008',
// 'exp':'789',
// 'gold':'999'
// }
// ]
// }
let data = JSON.parse(data_str!);
console.log(data);
let win = data.win;
let users_info = data.users_info;
let my_info;
if (win) {
$('#win').show();
} else {
$('#lose').show();
}
console.log(data);
for (let user_info of users_info) {
let tr_style = '';
if (user_info.isPlay) {
tr_style = ' class="myInfo_tr"';
my_info = user_info;
}
let tr = '<tr' + tr_style + '> <td><img src="' + user_info.icon + '"></td><td>' + user_info.name + '</td><td>' + user_info.score + '</td><td>' + user_info.exp + '</td><td>' + user_info.gold + '</td></tr>';
$('#users_info').append(tr);
}
$('#myIcon').attr('src', my_info.icon);
$('#myName').html(my_info.name);
$('#myScore').html(my_info.score);
$('#myExp').html(my_info.exp);
$('#myGold').html(my_info.gold);
let t = setTimeout(function () {
window.opener = null;
window.close();
}, 5000);
$('html').hover(function () {
clearTimeout(t);
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="./node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<style>
html,div,body,td,tr{
background: rgba(0,0,0,0);
font-size:14px;
font-family:-apple-system, Arial, 'Source Sans Pro', "Microsoft YaHei", 'Microsoft JhengHei', "WenQuanYi Micro Hei", sans-serif;
padding:0;
margin:0;
color:#00a4d9;
}
i:hover{
color:#0b88b1;
}
td{
text-align:center;
width:50px;
height:20px;
line-height: 20px;
padding:2px;
}
td:nth-child(1){
width:auto;
}
td:nth-child(2){
text-align:left;
width:150px
}
img{
display: block;
height: 100%;
}
.window{
position:relative;
width:320px;
height:180px;
background:linear-gradient(to bottom, #bfcdd2, rgba(218, 218, 218, 0.17));
padding:5px;
}
.myIcon{
float:left;
height:100%
}
.close{
position:absolute;
top:5px;
right:5px
}
.title{
/*display: table;*/
height:50px;
line-height:30px;
padding:5px;
border-bottom:1px #fff solid;
color:#00a4d9
}
.winOrLose{
font-size:30px;
display:table-cell;
vertical-align:middle;
padding-right:10px;
display: none;
}
.myInfo_tr{background:linear-gradient(to right, rgba(255,255,255,1), rgba(255,255,255,0.5));}
#myName{
height:50%;
line-height:100%;
font-size:25px;
}
#myScore{font-size:25px; padding-right: 10px}
#myExp{font-size:15px; color:green; padding-right: 10px}
#myGold{font-size:15px; color:#ec6d20; padding-right: 10px}
#win{color:green;}
#lose{color:red;}
#users_info{border-collapse:collapse;}
</style>
</head>
<body>
<div class="window">
<i onclick="window.opener=null;window.close();" class="fa fa-times close" title="关闭"></i>
<div class="title">
<div class="myIcon">
<img id="myIcon" >
</div>
<div style="float:left; padding-left:10px">
<div id="myName"></div>
<div style="height:50%;">
<span id="myScore"></span>
<span id="myExp"></span>
<span id="myGold"></span>
</div>
</div>
<div style="height:100%; float:right; display:table;">
<span id="win" class="winOrLose"></span>
<span id="lose" class="winOrLose"></span>
<span id="a_draw" class="winOrLose"></span>
</div>
</div>
<div class="clear:both"></div>
<div style="padding:5px;">
<table id="users_info">
<tr>
<th colspan="2">玩家</th>
<th>评价</th>
<th>经验</th>
<th>金币</th>
</tr>
</table>
</div>
</div>
<script>
window.exports = {}
</script>
<script src="end_YGOPro.js"></script>
</body>
</html>
/**
* Created by break on 2017/6/9.
*/
import * as $ from 'jquery';
let data_url = (new URL(document.location.toString())).searchParams;
let data_str = data_url.get('data');
console.log(data_str);
// {"usernamea": "loyi",
// "usernameb": "saten",
// "userscorea": 2,
// "userscoreb": 0,
// "expa": 36.5,
// "expb": 9,
// "expa_ex": 35.5,
// "expb_ex": 8.5,
// "pta": 479.950607945308,
// "ptb": 494.012345698275,
// "pta_ex": 479.950607945308,
// "ptb_ex": 494.012345698275,
// "type": "entertain",
// "start_time": "2017-06-12T17:07:54.000Z",
// "end_time": "2017-06-12T17:23:16.000Z"}
let data = JSON.parse(data_str!);
let icona = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.usernamea + '/25/1.png';
let iconb = 'https://ygobbs.com/user_avatar/ygobbs.com/' + data.usernameb + '/25/1.png';
console.log(data);
if (data.usernamea === data.myname) {
if ( data.userscorea > data.userscoreb) {
$('#win').show();
}else if ( data.userscorea < data.userscoreb) {
$('#lose').show();
}else {
$('#a_draw').show();
}
$('#myIcon').attr('src', icona);
$('#myName').html(data.usernamea);
$('#myScore').html(data.userscorea);
$('#myExp').html(parseInt(data.expa).toString());
$('#myGold').html(parseInt(data.pta).toString());
let tr = '<tr class="myInfo_tr"><td><img src="' + icona + '"></td><td>' + data.usernamea + '</td><td>' + data.userscorea + '</td><td>' + parseInt(data.expa).toString() + '</td><td>' + parseInt(data.pta).toString() + '</td></tr>';
$('#users_info').append(tr);
tr = '<tr><td><img src="' + iconb + '"></td><td>' + data.usernameb + '</td><td>' + data.userscoreb + '</td><td>' + parseInt(data.expb).toString() + '</td><td>' + parseInt(data.ptb).toString() + '</td></tr>';
$('#users_info').append(tr);
}else {
if ( data.userscorea > data.userscoreb) {
$('#lose').show();
}else if ( data.userscorea < data.userscoreb) {
$('#win').show();
}else {
$('#a_draw').show();
}
$('#myIcon').attr('src', iconb);
$('#myName').html(data.usernameb);
$('#myScore').html(data.userscoreb);
$('#myExp').html(parseInt(data.expb).toString());
$('#myGold').html(parseInt(data.ptb).toString());
let tr = '<tr><td><img src="' + icona + '"></td><td>' + data.usernamea + '</td><td>' + data.userscorea + '</td><td>' + parseInt(data.expa).toString() + '</td><td>' + parseInt(data.pta).toString() + '</td></tr>';
$('#users_info').append(tr);
tr = '<tr class="myInfo_tr"><td><img src="' + iconb + '"></td><td>' + data.usernameb + '</td><td>' + data.userscoreb + '</td><td>' + parseInt(data.expb).toString() + '</td><td>' + parseInt(data.ptb).toString() + '</td></tr>';
$('#users_info').append(tr);
}
let t = setTimeout(function () {
window.opener = null;
window.close();
}, 5000);
$('html').hover(function () {
clearTimeout(t);
});
// let {ipcRenderer} = require('electron');
// setTimeout( function(){ipcRenderer.send('massage', '')} , 1000);
This diff was suppressed by a .gitattributes entry.
...@@ -27,7 +27,7 @@ if (handleElevate()) { ...@@ -27,7 +27,7 @@ if (handleElevate()) {
return; return;
} }
const { ipcMain, app, shell, BrowserWindow, Menu, Tray } = require('electron'); const { ipcMain, app, shell, BrowserWindow, Menu, Tray, Notification } = require('electron');
const { autoUpdater } = require('electron-updater'); const { autoUpdater } = require('electron-updater');
const isDev = require('electron-is-dev'); const isDev = require('electron-is-dev');
const child_process = require('child_process'); const child_process = require('child_process');
...@@ -37,6 +37,9 @@ const path = require('path'); ...@@ -37,6 +37,9 @@ const path = require('path');
// be closed automatically when the JavaScript object is garbage collected. // be closed automatically when the JavaScript object is garbage collected.
let mainWindow; let mainWindow;
// aria2c启动失败则为null
let aria2c;
// 单实例 // 单实例
const gotTheLock = app.requestSingleInstanceLock() const gotTheLock = app.requestSingleInstanceLock()
...@@ -136,9 +139,18 @@ function createAria2c() { ...@@ -136,9 +139,18 @@ function createAria2c() {
default: default:
throw 'unsupported platform'; throw 'unsupported platform';
} }
return child_process.spawn(aria2c_path, ['--enable-rpc', '--rpc-allow-origin-all', '--continue', '--split=10', '--min-split-size=1M', '--max-connection-per-server=10', '--remove-control-file', '--allow-overwrite'], { stdio: 'ignore' }); aria2c = child_process.spawn(aria2c_path, [
'--enable-rpc',
'--rpc-allow-origin-all',
'--rpc-listen-port=6800',
'--continue',
'--split=10',
'--min-split-size=1M',
'--max-connection-per-server=10',
'--remove-control-file',
'--allow-overwrite'
], { stdio: 'ignore' });
} }
const aria2c = createAria2c();
// 主窗口 // 主窗口
function createWindow() { function createWindow() {
...@@ -212,6 +224,12 @@ app.on('ready', async () => { ...@@ -212,6 +224,12 @@ app.on('ready', async () => {
if (process.platform === 'win32') { if (process.platform === 'win32') {
createTray(); createTray();
} }
createAria2c();
aria2c.on('error', (err) => {
new Notification({ title: 'MyCard', body: '启动aria2失败,可能是被杀毒软件误删。游戏下载和更新功能将不可用。' }).show();
console.error(err);
aria2c = null;
});
if (process.env['NODE_ENV'] === 'production') { if (process.env['NODE_ENV'] === 'production') {
/*let updateTempPath = '~/.cache/mycard-updater' /*let updateTempPath = '~/.cache/mycard-updater'
if (process.platform === 'win32') { if (process.platform === 'win32') {
...@@ -248,7 +266,7 @@ app.on('activate', function () { ...@@ -248,7 +266,7 @@ app.on('activate', function () {
app.on('quit', () => { app.on('quit', () => {
// windows 在非 detach 模式下会自动退出子进程 // windows 在非 detach 模式下会自动退出子进程
if (process.platform !== 'win32') { if (process.platform !== 'win32' && aria2c) {
aria2c.kill(); aria2c.kill();
} }
}); });
This diff is collapsed.
This diff is collapsed.
{ {
"name": "mycard", "name": "mycard",
"version": "3.0.43", "version": "3.0.45",
"description": "moecube", "description": "moecube",
"keywords": [], "keywords": [],
"author": "zh99998 <zh99998@gmail.com>", "author": "zh99998 <zh99998@gmail.com>",
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
"release": "tsc && electron-builder", "release": "tsc && electron-builder",
"build:aot": "ngc -p tsconfig-aot.json && rollup -c rollup-config.js", "build:aot": "ngc -p tsconfig-aot.json && rollup -c rollup-config.js",
"tsc": "tsc", "tsc": "tsc",
"i18n": "ng-xi18n --i18nFormat 'xlf2' && sed -i.bak 's/source-language=\"en\"/source-language=\"zh-CN\"/' messages.xlf", "i18n": "ng-xi18n --i18nFormat xlf && sed -i.bak 's/source-language=\"en\"/source-language=\"zh-CN\"/' messages.xlf",
"i18n:upload": "npm run i18n && curl --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} --request PUT --header 'Content-type: multipart/form-data' --form content=@messages.xlf https://www.transifex.com/api/2/project/moecube/resource/messages/content/", "i18n:upload": "npm run i18n && curl --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} --request PUT --header 'Content-type: multipart/form-data' --form content=@messages.xlf https://www.transifex.com/api/2/project/moecube/resource/messages/content/",
"i18n:translate": "open https://www.transifex.com/moecube/moecube/translate/#en_US/messages/108367258?translated=no", "i18n:translate": "open https://www.transifex.com/moecube/moecube/translate/#en_US/messages/108367258?translated=no",
"i18n:download": "curl --output locale/messages.en-US.xlf --retry 5 --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} https://www.transifex.com/api/2/project/moecube/resource/messages/translation/en_US/?file && sed -i.bak 's/\\&amp;/\\&/g; s/\\&lt;/</g; s/\\&gt;/>/g; s/\\&quot;/\"/g;' locale/messages.en-US.xlf", "i18n:download": "curl --output locale/messages.en-US.xlf --retry 5 --location --user ${TRANSIFEX_USERNAME}:${TRANSIFEX_PASSWORD} https://www.transifex.com/api/2/project/moecube/resource/messages/translation/en_US/?file && sed -i.bak 's/\\&amp;/\\&/g; s/\\&lt;/</g; s/\\&gt;/>/g; s/\\&quot;/\"/g;' locale/messages.en-US.xlf",
...@@ -75,12 +75,13 @@ ...@@ -75,12 +75,13 @@
"@types/typeahead": "latest", "@types/typeahead": "latest",
"electron": "^4.2.12", "electron": "^4.2.12",
"electron-builder": "latest", "electron-builder": "latest",
"electron-builder-notarize": "^1.2.0",
"rollup": "latest", "rollup": "latest",
"rollup-plugin-commonjs": "latest", "rollup-plugin-commonjs": "latest",
"rollup-plugin-node-resolve": "latest", "rollup-plugin-node-resolve": "latest",
"rollup-plugin-uglify": "latest", "rollup-plugin-uglify": "latest",
"tslint": "^3.15.1", "tslint": "^3.15.1",
"typescript": "latest" "typescript": "^2.9.2"
}, },
"build": { "build": {
"productName": "MyCard", "productName": "MyCard",
...@@ -94,9 +95,6 @@ ...@@ -94,9 +95,6 @@
"extraResources": [ "extraResources": [
"bin" "bin"
], ],
"win": {
"publisherName": "Nana Yumesaki"
},
"linux": { "linux": {
"target": [ "target": [
{ {
...@@ -112,6 +110,11 @@ ...@@ -112,6 +110,11 @@
} }
] ]
}, },
"afterSign": "electron-builder-notarize",
"mac": {
"hardenedRuntime": true,
"entitlements": "./node_modules/electron-builder-notarize/entitlements.mac.inherit.plist"
},
"dmg": { "dmg": {
"contents": [ "contents": [
{ {
......
...@@ -86,8 +86,7 @@ mycard { ...@@ -86,8 +86,7 @@ mycard {
} }
.scroll:hover { .scroll:hover {
overflow-y: auto; overflow-y: overlay;
} }
body.resizing /deep/ * { body.resizing /deep/ * {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment