2024-05-28 19:42:10 +02:00
#
# KodeBlox Copyright 2019 Sayak Mukhopadhyay
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http: //www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import functools
import logging
import threading
import tkinter as tk
from os . path import dirname , join
import semantic_version
import sys
import time
import l10n
import myNotebook as nb
from config import config , appname , appversion
from py_discord_sdk import discordsdk as dsdk
2024-06-25 20:19:13 +02:00
plugin_name = " EliteRPC "
2024-05-28 19:42:10 +02:00
logger = logging . getLogger ( f ' { appname } . { plugin_name } ' )
_ = functools . partial ( l10n . Translations . translate , context = __file__ )
CLIENT_ID = 1013117837310693438
VERSION = ' 1.0 '
# Add global var for Planet name (landing + around)
planet = ' <Hidden> '
landingPad = ' 2 '
this = sys . modules [ __name__ ] # For holding module globals
2024-05-28 21:59:14 +02:00
ship_data = {
" sidewinder " : " Sidewinder " ,
" eagle " : " Eagle " ,
" hauler " : " Hauler " ,
" adder " : " Adder " ,
" adder_taxi " : " Apex Shuttle " ,
" empire_eagle " : " Imperial Eagle " ,
" viper " : " Viper Mk III " ,
" cobramkiii " : " Cobra Mk III " ,
" viper_mkiv " : " Viper Mk IV " ,
" diamondback " : " Diamondback Scout " ,
" cobramkiv " : " Cobra Mk IV " ,
" type6 " : " Type-6 Transporter " ,
" dolphin " : " Dolphin " ,
" diamondbackxl " : " Diamondback Explorer " ,
" empire_courier " : " Imperial Courier " ,
" independant_trader " : " Keelback " ,
" asp_scout " : " Asp Scout " ,
" vulture " : " Vulture " ,
" asp " : " Asp Explorer " ,
" federation_dropship " : " Federal Dropship " ,
" type7 " : " Type-7 Transporter " ,
" typex " : " Alliance Chieftain " ,
" federation_dropship_mkii " : " Federal Assault Ship " ,
" empire_trader " : " Imperial Clipper " ,
" typex_2 " : " Alliance Crusader " ,
" typex_3 " : " Alliance Challenger " ,
" federation_gunship " : " Federal Gunship " ,
" krait_light " : " Krait Phantom " ,
" krait_mkii " : " Krait Mk II " ,
" orca " : " Orca " ,
" ferdelance " : " Fer-de-Lance " ,
" mamba " : " Mamba " ,
" python " : " Python " ,
" type9 " : " Type-9 Heavy " ,
" belugaliner " : " Beluga Liner " ,
" type9_military " : " Type-10 Defender " ,
" anaconda " : " Anaconda " ,
" federation_corvette " : " Federal Corvette " ,
" cutter " : " Imperial Cutter "
}
def get_ship_name ( ship_type ) :
return ship_data . get ( ship_type , " Unknown Ship " )
2024-05-28 19:42:10 +02:00
def callback ( result ) :
logger . info ( f ' Callback: { result } ' )
if result == dsdk . Result . ok :
logger . info ( " Successfully set the activity! " )
elif result == dsdk . Result . transaction_aborted :
logger . warning ( f ' Transaction aborted due to SDK shutting down: { result } ' )
else :
logger . error ( f ' Error in callback: { result } ' )
raise Exception ( result )
def update_presence ( ) :
if isinstance ( appversion , str ) :
core_version = semantic_version . Version ( appversion )
elif callable ( appversion ) :
core_version = appversion ( )
logger . info ( f ' Core EDMC version: { core_version } ' )
if core_version < semantic_version . Version ( ' 5.0.0-beta1 ' ) :
logger . info ( ' EDMC core version is before 5.0.0-beta1 ' )
if config . getint ( " disable_presence " ) == 0 :
this . activity . state = this . presence_state
this . activity . details = this . presence_details
this . activity . assets . large_image = this . presence_large_image
this . activity . assets . large_text = this . presence_large_text
this . activity . assets . small_image = this . presence_small_image
this . activity . assets . small_text = this . presence_small_text
else :
logger . info ( ' EDMC core version is at least 5.0.0-beta1 ' )
if config . get_int ( " disable_presence " ) == 0 :
this . activity . state = this . presence_state
this . activity . details = this . presence_details
this . activity . assets . large_image = this . presence_large_image
this . activity . assets . large_text = this . presence_large_text
this . activity . assets . small_image = this . presence_small_image
this . activity . assets . small_text = this . presence_small_text
this . activity . timestamps . start = int ( this . time_start )
this . activity_manager . update_activity ( this . activity , callback )
def plugin_prefs ( parent , cmdr , is_beta ) :
"""
Return a TK Frame for adding to the EDMC settings dialog .
"""
if isinstance ( appversion , str ) :
core_version = semantic_version . Version ( appversion )
elif callable ( appversion ) :
core_version = appversion ( )
logger . info ( f ' Core EDMC version: { core_version } ' )
if core_version < semantic_version . Version ( ' 5.0.0-beta1 ' ) :
logger . info ( ' EDMC core version is before 5.0.0-beta1 ' )
this . disablePresence = tk . IntVar ( value = config . get_int ( " disable_presence " ) )
else :
logger . info ( ' EDMC core version is at least 5.0.0-beta1 ' )
this . disablePresence = tk . IntVar ( value = config . get_int ( " disable_presence " ) )
frame = nb . Frame ( parent )
nb . Checkbutton ( frame , text = " Disable Presence " , variable = this . disablePresence ) . grid ( )
nb . Label ( frame , text = ' Version %s ' % VERSION ) . grid ( padx = 10 , pady = 10 , sticky = tk . W )
return frame
def prefs_changed ( cmdr , is_beta ) :
"""
Save settings .
"""
config . set ( ' disable_presence ' , this . disablePresence . get ( ) )
config . set ( ' disable_presence ' , this . disableName . get ( ) )
update_presence ( )
def plugin_start3 ( plugin_dir ) :
this . plugin_dir = plugin_dir
this . discord_thread = threading . Thread ( target = check_run , args = ( plugin_dir , ) )
this . discord_thread . setDaemon ( True )
this . discord_thread . start ( )
2024-06-25 20:19:13 +02:00
return ' EliteRPC '
2024-05-28 19:42:10 +02:00
def plugin_stop ( ) :
this . activity_manager . clear_activity ( callback )
this . call_back_thread = None
def journal_entry ( cmdr , is_beta , system , station , entry , state ) :
global planet
global landingPad
presence_state = this . presence_state
presence_details = this . presence_details
presence_largeimage = this . presence_large_image
presence_largetext = this . presence_large_text
presence_smallimage = this . presence_small_image
presence_smalltext = this . presence_small_text
2024-05-28 21:59:14 +02:00
match entry [ ' event ' ] :
case ' StartUp ' :
2024-06-08 19:52:41 +02:00
presence_largetext = get_ship_name ( ( ' {ship} ' ) . format ( ship = state [ ' ShipType ' ] ) ) + ( ' | {shipname} ' ) . format ( shipname = state [ ' ShipName ' ] ) + ( ' | {shipident} ' ) . format ( shipident = state [ ' ShipIdent ' ] )
presence_smalltext = ( ' CMDR {cmdr} ' ) . format ( cmdr = cmdr ) # + ('{power}').format(power=entry['event', 'Powerplay'])
presence_largeimage = state [ ' ShipType ' ]
presence_smallimage = ' edlogosm '
2024-05-28 21:59:14 +02:00
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
presence_details = _ ( ' Docked at {station} ' ) . format ( station = station ) if station else _ ( ' Flying in normal space ' )
case ' Location ' :
2024-06-08 19:52:41 +02:00
presence_largetext = get_ship_name ( ( ' {ship} ' ) . format ( ship = state [ ' ShipType ' ] ) ) + ( ' | {shipname} ' ) . format ( shipname = state [ ' ShipName ' ] ) + ( ' | {shipident} ' ) . format ( shipident = state [ ' ShipIdent ' ] )
presence_smalltext = ( ' CMDR {cmdr} ' ) . format ( cmdr = cmdr ) #, power=state['Power'])
presence_largeimage = state [ ' ShipType ' ]
presence_smallimage = ' edlogosm '
2024-05-28 21:59:14 +02:00
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
presence_details = _ ( ' Docked at {station} ' ) . format ( station = station ) if station else _ ( ' Flying in normal space ' )
case ' StartJump ' :
2024-06-08 19:52:41 +02:00
presence_largetext = get_ship_name ( ( ' {ship} ' ) . format ( ship = state [ ' ShipType ' ] ) ) + ( ' | {shipname} ' ) . format ( shipname = state [ ' ShipName ' ] ) + ( ' | {shipident} ' ) . format ( shipident = state [ ' ShipIdent ' ] )
presence_smalltext = ( ' CMDR {cmdr} ' ) . format ( cmdr = cmdr ) #, power=state['Power'])
presence_largeimage = state [ ' ShipType ' ]
presence_smallimage = ' edlogosm '
2024-05-28 21:59:14 +02:00
presence_state = _ ( ' Jumping ' )
presence_details = _ ( ' Jumping to system {system} ' ) . format ( system = entry [ ' StarSystem ' ] ) if entry [ ' JumpType ' ] == ' Hyperspace ' else _ ( ' Preparing for supercruise ' )
case ' SupercruiseEntry ' :
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
presence_details = _ ( ' Supercruising ' )
case ' SupercruiseExit ' :
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
2024-05-28 19:42:10 +02:00
presence_details = _ ( ' Flying in normal space ' )
2024-05-28 21:59:14 +02:00
case ' FSDJump ' :
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
presence_details = _ ( ' Supercruising ' )
case ' Docked ' :
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
2024-05-28 19:42:10 +02:00
presence_details = _ ( ' Docked at {station} ' ) . format ( station = station )
2024-05-28 21:59:14 +02:00
case ' Undocked ' :
presence_state = _ ( ' In system {system} ' ) . format ( system = system )
presence_details = _ ( ' Flying near {station} ' ) . format ( station = entry [ ' StationName ' ] ) if entry [ ' event ' ] in ( ' Undocked ' , ' DockingCancelled ' , ' DockingTimeout ' ) else _ ( ' Flying in normal space ' )
case ' ShutDown ' :
presence_state = _ ( ' Main Menu ' )
2024-05-28 19:42:10 +02:00
presence_details = ' '
2024-05-28 21:59:14 +02:00
case ' DockingGranted ' :
landingPad = entry [ ' LandingPad ' ]
case ' Music ' :
if entry [ ' MusicTrack ' ] == ' MainMenu ' :
presence_state = _ ( ' In Main Menu ' )
presence_details = ' '
case ' ApproachBody ' :
presence_details = _ ( ' Approaching {body} ' ) . format ( body = entry [ ' Body ' ] )
planet = entry [ ' Body ' ]
case ' Touchdown ' if entry [ ' PlayerControlled ' ] :
presence_details = _ ( ' Landed on {body} ' ) . format ( body = planet )
case ' Liftoff ' :
presence_details = _ ( ' Flying around {body} ' ) . format ( body = planet ) if entry [ ' PlayerControlled ' ] else _ ( ' In SRV on {body} , ship in orbit ' ) . format ( body = planet )
case ' LeaveBody ' :
presence_details = _ ( ' Supercruising ' )
2024-06-08 19:52:41 +02:00
case ' Disembark ' :
presence_largetext = ( ' Using the {suitcurrent} suit. ' ) . format ( suitcurrent = state [ ' SuitCurrent ' ] )
case ' Embark ' :
presence_largeimage = state [ ' ShipType ' ]
presence_largetext = get_ship_name ( ( ' {ship} ' ) . format ( ship = state [ ' ShipType ' ] ) ) + ( ' | {shipname} ' ) . format ( shipname = state [ ' ShipName ' ] ) + ( ' | {shipident} ' ) . format ( shipident = state [ ' ShipIdent ' ] )
case ' Loadout ' : # when switching ships
presence_largeimage = state [ ' ShipType ' ]
presence_largetext = get_ship_name ( ( ' {ship} ' ) . format ( ship = state [ ' ShipType ' ] ) ) + ( ' | {shipname} ' ) . format ( shipname = state [ ' ShipName ' ] ) + ( ' | {shipident} ' ) . format ( shipident = state [ ' ShipIdent ' ] )
2024-05-28 21:59:14 +02:00
case ' LaunchSRV ' :
presence_details = _ ( ' In SRV on {body} ' ) . format ( body = planet )
case ' DockSRV ' :
presence_details = _ ( ' Landed on {body} ' ) . format ( body = planet )
case _ :
# No specific action for other events
pass
2024-05-28 19:42:10 +02:00
2024-06-08 19:52:41 +02:00
#if entry['TimePledged']:
# presence_smalltext = presence_smalltext + (' | {power}').format(power=state['Power'])
2024-05-28 19:42:10 +02:00
if ( presence_state != this . presence_state or
presence_details != this . presence_details or
presence_largeimage != this . presence_large_image or
presence_largetext != this . presence_large_text or
presence_smallimage != this . presence_small_image or
presence_smalltext != this . presence_small_text ) :
this . presence_state = presence_state
this . presence_details = presence_details
this . presence_large_image = presence_largeimage
this . presence_large_text = presence_largetext
this . presence_small_image = presence_smallimage
this . presence_small_text = presence_smalltext
update_presence ( )
def check_run ( plugin_dir ) :
plugin_path = join ( dirname ( plugin_dir ) , plugin_name )
retry = True
while retry :
time . sleep ( 1 / 10 )
try :
this . app = dsdk . Discord ( CLIENT_ID , dsdk . CreateFlags . no_require_discord , plugin_path )
retry = False
except Exception :
pass
this . activity_manager = this . app . get_activity_manager ( )
this . activity = dsdk . Activity ( )
this . call_back_thread = threading . Thread ( target = run_callbacks )
this . call_back_thread . setDaemon ( True )
this . call_back_thread . start ( )
this . presence_state = _ ( ' Connecting CMDR Interface ' )
this . presence_details = ' '
this . presence_large_image = ' edlogo '
this . presence_large_text = ' EliteRPC '
this . presence_small_image = ' '
this . presence_small_text = ' '
this . time_start = time . time ( )
this . disablePresence = None
this . disableName = None
update_presence ( )
def run_callbacks ( ) :
try :
while True :
time . sleep ( 1 / 10 )
this . app . run_callbacks ( )
except Exception :
2024-06-25 20:19:13 +02:00
check_run ( this . plugin_dir )