Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
mycard
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
syntax_j
mycard
Commits
6a8fd953
Commit
6a8fd953
authored
May 30, 2013
by
神楽坂玲奈
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
init
parents
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
364 additions
and
0 deletions
+364
-0
.gitignore
.gitignore
+25
-0
README.md
README.md
+0
-0
config.json
config.json
+2
-0
icon.ico
icon.ico
+0
-0
main.rb
main.rb
+337
-0
No files found.
.gitignore
0 → 100644
View file @
6a8fd953
#################
## Mycard
#################
/error.txt
/main.exe
#################
## Jetbrains
#################
/.idea/
#############
## Windows detritus
#############
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
\ No newline at end of file
README.md
0 → 100644
View file @
6a8fd953
config.json
0 → 100644
View file @
6a8fd953
{
"port"
:
9998
,
"ygopro"
:{
"path"
:
"e:/zh99998/Documents/GitHub/mycard-lite"
,
"textfont"
:
"c:/windows/fonts/simsun.ttc"
,
"numfont"
:
"c:/windows/fonts/arialbd.ttf"
},
"url"
:
"http://my-card.in/rooms"
}
\ No newline at end of file
icon.ico
0 → 100644
View file @
6a8fd953
361 KB
main.rb
0 → 100644
View file @
6a8fd953
begin
Version
=
"0.1.0"
Platform
=
(
RUBY_PLATFORM
[
'mswin'
]
||
RUBY_PLATFORM
[
'mingw'
])
?
:
win32
:
:linux
Config
=
{
'port'
=>
9998
,
'ygopro'
=>
{
'path'
=>
[
'ygocore/ygopro_vs.exe'
,
'ygopro_vs.exe'
],
'textfont'
=>
[
'fonts/wqy-microhei.ttc'
,
'/usr/share/fonts/wqy-microhei/wqy-microhei.ttc'
,
'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc'
,
'c:/windows/fonts/simsun.ttc'
],
'numfont'
=>
[
'/usr/share/fonts/gnu-free/FreeSansBold.ttf'
,
'c:/windows/fonts/arialbd.ttf'
]
},
"url"
=>
'http://my-card.in/rooms'
}
Dir
.
chdir
File
.
dirname
(
ENV
[
"OCRA_EXECUTABLE"
]
||
__FILE__
)
require
'json'
if
File
.
file?
'config.json'
config
=
open
(
'config.json'
)
{
|
f
|
JSON
.
load
(
f
)
}
Config
.
merge!
config
if
config
.
is_a?
Hash
end
Config
[
'ygopro'
][
'path'
]
=
Config
[
'ygopro'
][
'path'
].
find
{
|
path
|
File
.
file?
path
}
if
Config
[
'ygopro'
][
'path'
].
is_a?
Enumerable
if
!
Config
[
'ygopro'
][
'path'
]
require
'win32api'
GetOpenFileName
=
Win32API
.
new
(
"comdlg32.dll"
,
"GetOpenFileNameW"
,
"p"
,
"i"
)
title
=
"select ygopro_vs.exe"
filter
=
{
"ygopro_vs.exe"
=>
"ygopro_vs.exe"
}
OFN_EXPLORER
=
0x00080000
OFN_PATHMUSTEXIST
=
0x00000800
OFN_FILEMUSTEXIST
=
0x00001000
OFN_ALLOWMULTISELECT
=
0x00000200
OFN_FLAGS
=
OFN_EXPLORER
|
OFN_PATHMUSTEXIST
|
OFN_FILEMUSTEXIST
|
OFN_ALLOWMULTISELECT
szFile
=
(
0
.
chr
*
20481
).
encode
(
"UTF-16LE"
)
szFileTitle
=
0
.
chr
*
2049
szTitle
=
(
title
+
"
\0
"
).
encode
(
"UTF-16LE"
)
szFilter
=
(
filter
.
flatten
.
join
(
"
\0
"
)
+
"
\0\0
"
).
encode
(
"UTF-16LE"
)
szInitialDir
=
"
\0
"
ofn
=
[
76
,
# lStructSize L
0
,
# hwndOwner L
0
,
# hInstance L
szFilter
,
# lpstrFilter L
0
,
# lpstrCustomFilter L
0
,
# nMaxCustFilter L
1
,
# nFilterIndex L
szFile
,
# lpstrFile L
szFile
.
size
-
1
,
# nMaxFile L
szFileTitle
,
# lpstrFileTitle L
szFileTitle
.
size
-
1
,
# nMaxFileTitle L
szInitialDir
,
# lpstrInitialDir L
szTitle
,
# lpstrTitle L
OFN_FLAGS
,
# Flags L
0
,
# nFileOffset S
0
,
# nFileExtension S
0
,
# lpstrDefExt L
0
,
# lCustData L
0
,
# lpfnHook L
0
# lpTemplateName L
].
pack
(
"LLLPLLLPLPLPPLS2L4"
)
Dir
.
chdir
(
'.'
)
{
p
GetOpenFileName
.
call
(
ofn
)
}
szFile
.
delete!
(
"
\0
"
.
encode
(
"UTF-16LE"
))
result
=
szFile
.
encode
(
"UTF-8"
)
result
=
File
.
expand_path
result
if
result
Config
[
'ygopro'
][
'path'
]
=
result
else
exit
end
end
Config
[
'ygopro'
][
'textfont'
]
=
Config
[
'ygopro'
][
'textfont'
].
find
{
|
path
|
File
.
file?
path
}
if
Config
[
'ygopro'
][
'textfont'
].
is_a?
Enumerable
Config
[
'ygopro'
][
'numfont'
]
=
Config
[
'ygopro'
][
'numfont'
].
find
{
|
path
|
File
.
file?
path
}
if
Config
[
'ygopro'
][
'numfont'
].
is_a?
Enumerable
def
save_config
(
config
=
Config
)
require
'json'
open
(
'config.json'
,
'w'
)
{
|
f
|
JSON
.
dump
config
,
f
}
end
def
registed?
path
,
command
,
icon
=
register_paths
require
'win32/registry'
begin
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
open
(
'mycard'
)
{
|
reg
|
return
false
unless
reg
[
'URL Protocol'
]
==
path
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
open
(
'mycard\shell\open\command'
)
{
|
reg
|
return
false
unless
reg
[
nil
]
==
command
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
open
(
'mycard\DefaultIcon'
)
{
|
reg
|
return
false
unless
reg
[
nil
]
==
icon
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
open
(
'.ydk'
)
{
|
reg
|
return
false
unless
reg
[
nil
]
==
'mycard'
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
open
(
'.yrp'
)
{
|
reg
|
return
false
unless
reg
[
nil
]
==
'mycard'
}
#Win32::Registry::HKEY_CLASSES_ROOT.open('.deck') { |reg| return false unless reg[nil] == 'mycard' }
rescue
return
false
end
true
end
def
register_paths
path
=
File
.
expand_path
(
ENV
[
"OCRA_EXECUTABLE"
]
||
$0
)
command
=
"
\"
#{
path
}
\"
\"
%1
\"
"
icon
=
"
\"
#{
path
}
\"
,0"
[
path
,
command
,
icon
]
end
def
register
require
'win32/registry'
path
,
command
,
icon
=
register_paths
begin
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
create
(
'mycard'
)
{
|
reg
|
reg
[
'URL Protocol'
]
=
path
.
ljust
path
.
bytesize
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
create
(
'mycard\shell\open\command'
)
{
|
reg
|
reg
[
nil
]
=
command
.
ljust
command
.
bytesize
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
create
(
'mycard\DefaultIcon'
)
{
|
reg
|
reg
[
nil
]
=
icon
.
ljust
icon
.
bytesize
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
create
(
'.ydk'
)
{
|
reg
|
reg
[
nil
]
=
'mycard'
}
Win32
::
Registry
::
HKEY_CLASSES_ROOT
.
create
(
'.yrp'
)
{
|
reg
|
reg
[
nil
]
=
'mycard'
}
#Win32::Registry::HKEY_CLASSES_ROOT.create('.deck') { |reg| reg[nil] = 'mycard' }
true
rescue
Win32
::
Registry
::
Error
#Access Denied, need elevation
if
ENV
[
"OCRA_EXECUTABLE"
]
System
.
elevate
ENV
[
"OCRA_EXECUTABLE"
],
[
'register'
]
else
System
.
elevate
Gem
.
ruby
,
[
$0
,
'register'
]
end
'elevated'
end
end
def
service
require
'websocket-eventmachine-server'
EventMachine
.
run
do
WebSocket
::
EventMachine
::
Server
.
start
(
:host
=>
"0.0.0.0"
,
:port
=>
Config
[
'port'
])
do
|
ws
|
ws
.
onopen
do
ws
.
send
({
'version'
=>
Version
}.
to_json
)
end
ws
.
onmessage
do
|
msg
,
type
|
ws
.
send
parse
(
msg
).
to_json
end
ws
.
onclose
do
puts
"Client disconnected"
end
end
end
end
def
load_system_conf
system_conf
=
{}
conf_path
=
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'system.conf'
)
IO
.
readlines
(
conf_path
,
'r:UTF-8'
).
each
do
|
line
|
next
if
line
[
0
,
1
]
==
'#'
field
,
contents
=
line
.
chomp
.
split
(
' = '
,
2
)
system_conf
[
field
]
=
contents
end
if
File
.
file?
conf_path
system_conf
end
def
save_system_conf
(
system_conf
)
font
,
size
=
system_conf
[
'textfont'
]
?
system_conf
[
'textfont'
].
split
(
' '
)
:
nil
if
Config
[
'ygopro'
][
'textfont'
]
and
(
!
font
or
!
File
.
file?
(
File
.
expand_path
(
font
,
File
.
dirname
(
Config
[
'ygopro'
][
'path'
])))
or
size
.
to_i
.
to_s
!=
size
)
require
'pathname'
font_path
=
Pathname
.
new
(
Config
[
'ygopro'
][
'textfont'
])
font_path
=
font_path
.
relative_path_from
(
Pathname
.
new
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
])))
if
font_path
.
relative?
system_conf
[
'textfont'
]
=
"
#{
font_path
}
14"
end
font
=
system_conf
[
'numfont'
]
if
Config
[
'ygopro'
][
'numfont'
]
and
(
!
font
or
!
File
.
file?
(
File
.
expand_path
(
font
,
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]))))
require
'pathname'
font_path
=
Pathname
.
new
(
Config
[
'ygopro'
][
'numfont'
])
font_path
=
font_path
.
relative_path_from
(
Pathname
.
new
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
])))
if
font_path
.
relative?
system_conf
[
'numfont'
]
=
font_path
end
open
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'system.conf'
),
'w:UTF-8'
)
{
|
file
|
file
.
write
system_conf
.
collect
{
|
key
,
value
|
"
#{
key
}
=
#{
value
}
"
}.
join
(
"
\n
"
)
}
end
module
System
module_function
def
open
(
path
=
Config
[
'url'
],
*
args
)
require
'win32ole'
$shell
||=
WIN32OLE
.
new
(
'Shell.Application'
)
$shell
.
ShellExecute
(
path
,
*
args
)
end
def
elevate
(
path
,
args
,
pwd
=
Dir
.
pwd
)
open
path
,
args
.
join
(
' '
),
Dir
.
pwd
,
'runas'
end
end
def
run_ygopro
(
parameter
)
System
.
open
(
Config
[
'ygopro'
][
'path'
],
parameter
,
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]))
end
def
join
(
room
)
options
=
load_system_conf
room
[
'user'
]
=
local_user
(
options
)
if
!
room
[
'user'
][
'nickname'
]
if
room
[
'server'
][
'auth'
]
and
room
[
'user'
][
'password'
]
options
[
'nickname'
]
=
"
#{
room
[
'user'
][
'nickname'
]
}
$
#{
room
[
'user'
][
'password'
]
}
"
else
options
[
'nickname'
]
=
room
[
'user'
][
'nickname'
]
end
options
[
'lastip'
]
=
room
[
'server'
][
'ip'
]
options
[
'lastport'
]
=
room
[
'server'
][
'port'
].
to_s
options
[
'roompass'
]
=
room
[
'name'
]
save_system_conf
(
options
)
run_ygopro
(
'-j'
)
end
def
deck
(
deck
)
File
.
rename
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
,
deck
+
'.ydk'
),
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
,
deck
.
gsub!
(
' '
,
'_'
)
+
'.ydk'
))
if
deck
[
' '
]
options
=
load_system_conf
options
[
'lastdeck'
]
=
deck
save_system_conf
(
options
)
run_ygopro
(
'-d'
)
end
def
replay
(
replay
)
require
'fileutils'
moved_replay_directory
=
File
.
expand_path
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]))
==
Dir
.
pwd
?
'replay_moved'
:
'replay'
files
=
Dir
.
glob
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'replay'
,
'*.yrp'
))
-
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'replay'
,
replay
+
'.yrp'
)
FileUtils
.
mv
files
,
moved_replay_directory
run_ygopro
(
'-r'
)
end
def
local_user
(
system_conf
=
load_system_conf
)
nickname
,
password
=
system_conf
[
'nickname'
].
split
(
'$'
)
{
'nickname'
=>
nickname
,
'password'
=>
password
}
end
def
parse
(
command
)
case
command
when
'register'
register
when
'registed'
registed?
when
'mycard:///'
#service
when
/mycard:\/\/(.*)/
parse_uri
(
command
)
when
/.*\.(?:ydk|yrp)$/
parse_path
(
command
)
#解析函数可以分开
end
end
def
parse_path
(
path
)
require
'fileutils'
case
File
.
extname
(
path
)
when
'.ydk'
deck_directory
=
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
)
Dir
.
mkdir
(
deck_directory
)
unless
File
.
directory?
(
deck_directory
)
FileUtils
.
copy
(
path
,
deck_directory
)
deck
(
File
.
basename
(
path
,
'.ydk'
))
when
'.yrp'
replay_directory
=
File
.
expand_path
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]))
unless
File
.
expand_path
(
File
.
dirname
(
path
))
==
replay_directory
Dir
.
mkdir
(
replay_directory
)
unless
File
.
directory?
(
replay_directory
)
FileUtils
.
copy
(
path
,
replay_directory
)
end
replay
(
File
.
basename
(
path
,
'.yrp'
))
end
end
def
parse_uri
(
uri
)
file
=
uri
.
dup
.
force_encoding
(
"UTF-8"
)
file
.
force_encoding
(
"GBK"
)
unless
file
.
valid_encoding?
file
.
encode!
(
"UTF-8"
)
require
'uri'
if
uri
[
0
,
9
]
==
'mycard://'
file
=
URI
.
unescape
file
[
9
,
file
.
size
-
9
]
uri
=
"http://"
+
URI
.
escape
(
file
)
else
uri
=
file
end
case
file
when
/^(.*\.yrp)$/i
require
'open-uri'
#fix File.basename
$1
=~
/(.*)(?:\\|\/)(.*?\.yrp)/
src
=
open
(
uri
,
'rb'
)
{
|
src
|
src
.
read
}
Dir
.
mkdir
(
"replay"
)
unless
File
.
directory?
(
"replay"
)
open
(
'replay/'
+
$2
,
'wb'
)
{
|
dest
|
dest
.
write
src
}
replay
(
'replay/'
+
$2
)
when
/^(.*\.ydk)$/i
require
'open-uri'
#fix File.basename
$1
=~
/(.*)(?:\\|\/)(.*?)\.ydk/
src
=
open
(
uri
,
'rb'
)
{
|
src
|
src
.
read
}
Dir
.
mkdir
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
))
unless
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
)
open
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'deck'
,
$2
+
'.ydk'
),
'wb'
)
{
|
dest
|
dest
.
write
src
}
deck
(
$2
)
when
/^(?:(.+?)(?:\:(.+?))?\@)?([\d\.]+)\:(\d+)(?:\/(.*))$/
join
({
'name'
=>
$5
.
to_s
,
'user'
=>
{
'nickname'
=>
$1
,
'password'
=>
$2
},
'server'
=>
{
'ip'
=>
$3
,
'port'
=>
$4
.
to_i
,
'auth'
=>
!!
$2
}
})
end
end
save_config
if
ARGV
.
first
puts
parse
(
ARGV
.
first
).
to_json
else
register
if
!
registed?
System
.
open
(
Config
[
'url'
])
#service
#require all, for ocra
require
'open-uri'
require
'pathname'
require
'win32api'
end
rescue
=>
exception
open
(
'error.txt'
,
'w'
)
{
|
f
|
f
.
write
([
exception
]
+
exception
.
backtrace
).
join
(
"
\r\n
"
)
}
exec
'notepad error.txt'
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment