From 14ed83ded6b36acd28ca7f87116af3f5f812c1aa Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Mon, 17 Jun 2024 12:46:50 +0200 Subject: [PATCH 01/35] add zh headers --- .../images/settings/general_settings_logo_zh.png | Bin 0 -> 2343 bytes .../settings/notification_settings_logo_zh.png | Bin 0 -> 3247 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/resources/images/settings/general_settings_logo_zh.png create mode 100644 src/resources/images/settings/notification_settings_logo_zh.png diff --git a/src/resources/images/settings/general_settings_logo_zh.png b/src/resources/images/settings/general_settings_logo_zh.png new file mode 100644 index 0000000000000000000000000000000000000000..4c58948e335de4e9792d2dd41be43ad6397c9a8f GIT binary patch literal 2343 zcmcguX;jkb8vkqAIGB?)mg zsE9VV6hTwOMhh$##>@px6iLwp!BE^nhwi;!@0@eL+z;>aJm>vA%X^;Z{GO|4JzO;inM0xjD-=f_8D4P1pLnYDE^#oAeV=$u>Hb)#keH;L4i5g#n)s*u0 zXg7Ew0Q}JYZK<$PPcH(1I^&enac>MlJQ{e-&>75{&)T#3Yt}KXY!`3vUQo79wmPDD z)A=IJMirfL)qt!eM6=2zEoyo3FONC|Z=cOQZy1YOTlo4b&Qdn;>@)E)uIYJt_?$u} zxDEk;v)}PGfn!!VPyl$N#RCBFNz5kT?AHH-Qs#$o)EL_YWQ7J#{Y?mSIgZQ~40Wt^ zeR@hFX?0`QxUj#Blo~yX1qei`OKK)|iQBzx8;`lN()-W)z`4=pOWG3V3agtmhAWFR zmUaFjk^BRy$Hm!*184$x#raneBXF|#q9E*^18zBlBxiMN>@#MZD+@0Iec0*J0-(f$ z_r-;HuYnC)GZUt6*0Eg&C9mdQ| z)?sRONLS6ev_J5wW4o9yrWAWC;;D;PMK10B6Z2ug^qpmKv6Y5xkXx=w5cs)O0WNJB z;WrY=n&WgjTmQLi5Ey=rw|Vm1nD$xT(Q*r9_yb>&CDAbV)NFa+~WwT^v-G7#jIQkH8CMiXlO2Lcl%})=1@Pfs}O@ zeM35c+kd-?NcF*%i1X^Tb4=6w?APtM?;8sTiTDP(L?O3L2za%9JFoG_q+)q~O3e8o z%vy)&C_RFK+vXm8qd#A@zCTi~PxPYB6~n8R=GmI3>7r^*%NS1`m`gqdwknitPEkQZBm>PKQ;Tzzn}+aMIS!d$>843o;axGN;c zt~0ab8vjCGC5nV(9o7H%@HTC=e!aKL7m48&HWQ>SaH}HYZ4}zD`!aK(ORh|WO_5NW zI@VTFqhmpAchz%P@cY~D?7np;-1Yl4)UpD(@yHKnyEEI?R@~S1(B4hD4H_7{bWVn| zVk`})`n5LoXESLtNJnOs3uhZTX{Kw9>kfyY!B&kADN=d73Es)}q(8)1uxN}8pA|S1 z;;%2|^ReBpx_Uw%51#qMaD=XV)bUksZ4ANdoEA;v5PwvtAn5X1=)D5uM6Hzc8oe_I z>X9q`nK9bI(SE9|jAsS-hT)G0)E%T_N!I|fH3UmHD*o(eR9M`LZ(u$ON^aG=x7d7oa4YKSMz?uI)WqR?D|rWaXG(_YyBYD{ zoK3p%ca_F0p~X@HRf5>f-k7G#CBDWI^M41$QI-r`iwC>eE0sGOOehY57+?FNArG0? zuza{*;>~tUd`^icJ*WszddY~w-l5Pf)KTSX{6eq8o*4FO@rA{-x6vQ>j%Z1Q!c$O# z_>`*2%nh<>TD6#OFs3uz-BXImgh!7kgZ`HjrP=V?t9~JFZ>;uM>`GU3)R?8VTs$;a z#vgU)+iy3({w-(c_&nzZA|WOtNk3y>-HX1aDDNScyrbe;0221N#WewqLzOiu z^QG=)oVyp!jxU)7!;t){7oMjD{K?KSkS(pIrD$AVvtGIf^YGa;uC45%Fsf^A-if35 zGB32*Ld0v!6sv{0SRx)SD(!ECwHs-oNWGtzGd7ae!9%Mb*(t--*@0}HM#|lYLhA%k zE$Tm3-UuI9H2SBbqLzp4%NLTjrsZBh1_=}<^x0d(n$A0`$$X16gK=|J&;sQSxK|#k zYyO%xO5wiD&WM^co~4$?WM+|-Ea0bMnS0W?#Wg09AFYor)P; zu4S!sckZoAq;SAJ#@3PIpn%^|C94sO>2KxV!R(ZjKr4M}v(`Bb={L(7E=Z2W&wvqC zL1cIZE8l(UVNtZoZ4 z;@kgjiMt&4GgwOHKY=%OMrWi{qP-)DOf6`L*d?-r5E?r$7p#BY8ek}20{3;>AV5}# zItl=;{lriKO!5C!dCUKMiSTU%0F2w+N>#Fb*BoCVqEu=EKxOFPQStvgBHZ}$X)1^u Xa$IGLPpDKm+yJMXJ)EjfT*&?l*&&h& literal 0 HcmV?d00001 diff --git a/src/resources/images/settings/notification_settings_logo_zh.png b/src/resources/images/settings/notification_settings_logo_zh.png new file mode 100644 index 0000000000000000000000000000000000000000..c12bfeac813a084eece7e86e8a80c759921d4d5a GIT binary patch literal 3247 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 W2;;hsoe&Qh0MypersAq!!oLA&!b$4@ literal 0 HcmV?d00001 From ce11c167b1db3a5b03e57d7b484d380e137027bd Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Mon, 17 Jun 2024 12:47:12 +0200 Subject: [PATCH 02/35] add zh lang file without crowdin (sry alex) thanks to chatgpt --- src/languages/zh.json | 771 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 771 insertions(+) create mode 100644 src/languages/zh.json diff --git a/src/languages/zh.json b/src/languages/zh.json new file mode 100644 index 000000000..70aab4b31 --- /dev/null +++ b/src/languages/zh.json @@ -0,0 +1,771 @@ +{ + "24HoursInGameTimePassed": "游戏时间已经过去24小时。", + "abandonedCabins": "废弃的小屋", + "abandonedMilitaryBase": "废弃的军事基地", + "abandonedSupermarket": "废弃的超市", + "addPlayerCap": "添加玩家", + "addSwitchCap": "添加开关", + "afkCap": "暂离", + "airfield": "飞机场", + "alarmHaveNotBeenTriggeredYet": "警报 {alarm} 还未触发。", + "alias": "别名", + "aliasAlreadyExist": "别名已存在。", + "aliasIndexCouldNotBeFound": "找不到别名索引。", + "aliasWasAdded": "已添加别名。", + "aliasWasRemoved": "已移除别名。", + "aliases": "别名", + "all": "全部", + "allTeammatesAreDead": "你的所有队友都已死亡。", + "alreadySubscribedToItem": "已订阅物品 {name}。", + "ampersand": "和号", + "andMorePlayers": "...和 {number} 更多玩家。", + "any": "任何", + "apostrophe": "撇号", + "arcticResearchBase": "北极研究基地", + "asterisk": "星号", + "asteriskCctvDesc": "*表示你需要一个对于每个地图都不同的数字代码", + "atLocation": "在 {location}。", + "atSign": "在标志", + "autoDayCap": "自动-白天", + "autoNightCap": "自动-夜晚", + "autoOffAnyOnlineCap": "自动关闭-任何在线", + "autoOffCap": "自动关闭", + "autoOffProximityCap": "自动关闭-邻近", + "autoOnAnyOnlineCap": "自动开启-任何在线", + "autoOnCap": "自动开启", + "autoOnProximityCap": "自动开启-邻近", + "autoSettingCap": "自动设置:", + "automaticallyTurnBackOnOff": "自动在 {time} 后将 {status}。", + "automaticallyTurningBackOnOff": "自动将 {device} 调回 {status}。", + "autoturret": "自动炮塔", + "badGateway": "错误网关:{error}", + "banditCamp": "强盗营地", + "baseIsUnderAttack": "你的基地正在受到攻击!", + "battlemetricsApiRequestFailed": "Battlemetrics API 请求失败:{api_call}。", + "battlemetricsCap": "战斗指标", + "battlemetricsFailedToUpdate": "Battlemetrics 服务器 {server} 更新失败。", + "battlemetricsGlobalLoginCap": "全球登录", + "battlemetricsGlobalLogoutCap": "全球注销", + "battlemetricsGlobalNameChangesCap": "全球名称更改", + "battlemetricsId": "BattlemetricsID", + "battlemetricsIdAndNameMissing": "Battlemetrics 实例缺少 id 和名称。", + "battlemetricsInstanceCouldNotBeFound": "无法找到 ID 为 {id} 的 Battlemetrics 实例。", + "battlemetricsOnlinePlayers": "Battlemetrics 在线玩家", + "battlemetricsPlayersLogin": "Battlemetrics 玩家登录", + "battlemetricsPlayersLogout": "Battlemetrics 玩家注销", + "battlemetricsPlayersNameChanged": "Battlemetrics 玩家名称已更改", + "battlemetricsServerNameChanged": "Battlemetrics 服务器名称已更改", + "battlemetricsServerNameChangesCap": "服务器名称更改", + "battlemetricsTrackerNameChangesCap": "跟踪器名称更改", + "battlemetricsTrackerPlayerNameChanged": "Battlemetrics 跟踪器玩家名称已更改", + "blacklist": "黑名单", + "boomBox": "爆炸箱", + "bot": "机器人", + "broadcaster": "广播员", + "buttonValueChange": "按钮交互 - 验证 ID: {id}, 值: {value}。", + "buy": "购买", + "calculated": "计算的", + "cargoAt": "在 {location}。", + "cargoLeavingMapAt": "货船将在 {location} 离开地图。", + "cargoLocatedAt": "货船位于 {location}。", + "cargoNotCurrentlyOnMap": "货船当前不在地图上。", + "cargoShipDetectedSetting": "检测到货船时发送通知。", + "cargoShipEgressSetting": "货船进入出口阶段时发送通知。", + "cargoShipEntersEgressStage": "货船应在 {location} 进入出口阶段。", + "cargoShipEntersMap": "货船从 {location} 进入地图。", + "cargoShipLeftMap": "货船刚刚在 {location} 离开地图。", + "cargoShipLeftSetting": "货船离开地图时发送通知。", + "cargoShipLocated": "货船位于 {location}。", + "cargoship": "货船", + "ceilingLight": "天花板灯", + "channelNameActivity": "活动", + "channelNameAlarms": "警报", + "channelNameCommands": "命令", + "channelNameEvents": "事件", + "channelNameInformation": "信息", + "channelNameServers": "服务器", + "channelNameSettings": "设置", + "channelNameStorageMonitors": "存储监控", + "channelNameSwitchGroups": "开关组", + "channelNameSwitches": "开关", + "channelNameTeamchat": "团队聊天", + "channelNameTrackers": "追踪器", + "chinook47": "支奴干 47", + "chinook47DetectedSetting": "检测到支奴干 47 进入地图时发送通知。", + "chinook47EntersMap": "支奴干 47 从 {location} 进入地图以投放锁定箱。", + "chinook47LeftMap": "支奴干 47 在 {location} 离开地图。", + "chinook47Located": "支奴干 47 位于 {location}。", + "chinook47NotOnMap": "支奴干 47 当前不在地图上。", + "christmasLights": "圣诞灯", + "circumflex": "抑扬符", + "clanTag": "氏族标签", + "codes": "代码", + "colon": "冒号", + "comma": "逗号", + "commandCap": "命令", + "commandDelaySetting": "应该有命令延迟吗?多长时间?", + "commandNotPossibleDiscord": "命令无法通过 Discord 执行。", + "commandSyntaxAdd": "添加", + "commandSyntaxAfk": "暂离", + "commandSyntaxAlive": "存活", + "commandSyntaxArmored": "装甲", + "commandSyntaxCargo": "货船", + "commandSyntaxChinook": "支奴干", + "commandSyntaxConnection": "连接", + "commandSyntaxConnections": "连接", + "commandSyntaxCraft": "制作", + "commandSyntaxDeath": "死亡", + "commandSyntaxDeaths": "死亡", + "commandSyntaxDecay": "衰变", + "commandSyntaxDespawn": "消失", + "commandSyntaxEvents": "事件", + "commandSyntaxHeli": "直升机", + "commandSyntaxLanguage": "语言", + "commandSyntaxLarge": "大", + "commandSyntaxLeader": "领导", + "commandSyntaxList": "列表", + "commandSyntaxMarker": "标记", + "commandSyntaxMarkers": "标记", + "commandSyntaxMarket": "市场", + "commandSyntaxMetal": "金属", + "commandSyntaxMute": "静音", + "commandSyntaxNote": "备注", + "commandSyntaxNotes": "备注", + "commandSyntaxOff": "关闭", + "commandSyntaxOffline": "离线", + "commandSyntaxOn": "开启", + "commandSyntaxOnline": "在线", + "commandSyntaxPlayer": "玩家", + "commandSyntaxPlayers": "玩家", + "commandSyntaxPop": "人口", + "commandSyntaxProx": "邻近", + "commandSyntaxRecycle": "回收", + "commandSyntaxRemove": "移除", + "commandSyntaxResearch": "研究", + "commandSyntaxSearch": "搜索", + "commandSyntaxSend": "发送", + "commandSyntaxSmall": "小", + "commandSyntaxStack": "堆叠", + "commandSyntaxStatus": "状态", + "commandSyntaxSteamid": "SteamID", + "commandSyntaxStone": "石头", + "commandSyntaxSubscribe": "订阅", + "commandSyntaxTTS": "文本转语音", + "commandSyntaxTeam": "团队", + "commandSyntaxTime": "时间", + "commandSyntaxTimer": "计时器", + "commandSyntaxTimers": "计时器", + "commandSyntaxTranslateFromTo": "翻译从...到...", + "commandSyntaxTranslateTo": "翻译至", + "commandSyntaxTwig": "枝条", + "commandSyntaxUnmute": "取消静音", + "commandSyntaxUnsubscribe": "取消订阅", + "commandSyntaxUpkeep": "维护", + "commandSyntaxUptime": "正常运行时间", + "commandSyntaxWipe": "擦除", + "commandSyntaxWood": "木头", + "commandsAlarmDesc": "智能警报操作。", + "commandsAlarmEditDesc": "编辑智能警报的属性。", + "commandsAlarmEditIdDesc": "智能警报的 ID。", + "commandsAlarmEditImageDesc": "设置最能代表智能警报的图像。", + "commandsAliasAddAliasDesc": "要使用的别名。", + "commandsAliasAddDesc": "添加别名。", + "commandsAliasAddValueDesc": "命令/字符序列。", + "commandsAliasDesc": "为命令/字符序列创建别名。", + "commandsAliasRemoveDesc": "删除别名。", + "commandsAliasRemoveIndexDesc": "要删除的别名的索引。", + "commandsAliasShowDesc": "显示所有注册的别名。", + "commandsBlacklistAddDesc": "将用户添加到黑名单。", + "commandsBlacklistDesc": "将用户列入机器人的黑名单。", + "commandsBlacklistDiscordUserDesc": "Discord 用户。", + "commandsBlacklistRemoveDesc": "从黑名单中删除用户。", + "commandsBlacklistShowDesc": "显示黑名单用户。", + "commandsBlacklistSteamidDesc": "用户的 SteamID。", + "commandsCctvDesc": "显示纪念碑的 CCTV 代码", + "commandsCraftDesc": "显示制作物品的成本。", + "commandsCraftQuantityDesc": "制作物品的数量。", + "commandsCredentialsAddDesc": "添加 FCM 凭证。", + "commandsCredentialsDesc": "设置/清除用户账户的 FCM 凭证。", + "commandsCredentialsRemoveDesc": "移除 FCM 凭证。", + "commandsCredentialsRemoveSteamIdDesc": "要移除的 FCM 凭证的 SteamID。", + "commandsCredentialsSetHosterDesc": "设置 FCM 凭证的主机。", + "commandsCredentialsSetHosterSteamIdDesc": "FCM 凭证主机的 SteamID。", + "commandsCredentialsShowDesc": "显示当前注册的 FCM 凭证。", + "commandsDecayDesc": "显示物品的衰变时间。", + "commandsDespawnDesc": "显示物品的消失时间。", + "commandsHelpCommandList": "命令列表", + "commandsHelpDesc": "显示帮助信息。", + "commandsHelpHowToCredentials": "如何注册凭证", + "commandsHelpHowToPairServer": "如何将机器人与 Rust 服务器配对", + "commandsItemDesc": "获取物品的详细信息。", + "commandsLeaderDesc": "从/给团队成员领导权。", + "commandsLeaderMemberDesc": "团队成员的名称。", + "commandsMapAllDesc": "获取包括纪念碑名称和标记的地图。", + "commandsMapCleanDesc": "获取干净的地图。", + "commandsMapDesc": "获取当前连接的服务器地图图像。", + "commandsMapMarkersDesc": "获取包含标记的地图。", + "commandsMapMonumentsDesc": "获取包含纪念碑名称的地图。", + "commandsMarketDesc": "游戏内自动售货机的操作。", + "commandsMarketListDesc": "显示订阅列表。", + "commandsMarketOrderDesc": "订单类型。", + "commandsMarketSearchDesc": "在自动售货机中搜索物品。", + "commandsMarketSubscribeDesc": "在自动售货机中订阅物品。", + "commandsMarketUnsubscribeDesc": "取消自动售货机中的物品订阅。", + "commandsPlayersBattlemetricsIdDesc": "服务器的 Battlemetrics ID(默认:已连接的服务器)。", + "commandsPlayersDesc": "根据 Battlemetrics 获取玩家/玩家信息。", + "commandsPlayersNameDesc": "根据玩家姓名在 Battlemetrics 上搜索玩家。", + "commandsPlayersPlayerIdDesc": "根据玩家 ID 在 Battlemetrics 上搜索玩家。", + "commandsPlayersPlayerIdPlayerIdDesc": "玩家的玩家 ID。", + "commandsPlayersStatusDesc": "搜索在线/离线/任何状态的玩家。", + "commandsRecycleDesc": "显示回收物品的输出。", + "commandsRecycleQuantityDesc": "回收物品的数量。", + "commandsResearchDesc": "显示研究物品的成本。", + "commandsResetAlarmsDesc": "重置警报频道。", + "commandsResetDesc": "重置 Discord 频道。", + "commandsResetInformationDesc": "重置信息频道。", + "commandsResetServersDesc": "重置服务器频道。", + "commandsResetSettingsDesc": "重置设置频道。", + "commandsResetStorageMonitorsDesc": "重置存储监控频道。", + "commandsResetSwitchesDesc": "重置开关和开关组频道。", + "commandsResetTrackersDesc": "重置追踪器频道。", + "commandsRoleClearDesc": "清除角色(允许所有人查看 rustplusplus 频道)。", + "commandsRoleDesc": "设置/清除将能够查看 rustplusplus 类别内容的特定角色。", + "commandsRoleSetDesc": "设置角色。", + "commandsRoleSetRoleDesc": "rustplusplus 频道将对其可见的角色。", + "commandsStackDesc": "显示物品的堆叠大小。", + "commandsStoragemonitorDesc": "存储监控操作。", + "commandsStoragemonitorEditDesc": "编辑存储监控的属性。", + "commandsStoragemonitorEditIdDesc": "存储监控的 ID。", + "commandsStoragemonitorEditImageDesc": "设置最能代表存储监控的图像。", + "commandsSwitchDesc": "智能开关操作。", + "commandsSwitchEditDesc": "编辑智能开关的属性。", + "commandsSwitchEditIdDesc": "智能开关的 ID。", + "commandsSwitchEditImageDesc": "设置最能代表智能开关的图像。", + "commandsUpkeepDesc": "显示物品的维护成本。", + "commandsUptimeBotDesc": "显示机器人的正常运行时间。", + "commandsUptimeDesc": "显示机器人和服务器的正常运行时间。", + "commandsUptimeServerDesc": "显示服务器的正常运行时间。", + "commandsVoiceBotJoinedVoice": "机器人已加入语音频道", + "commandsVoiceBotLeftVoice": "机器人已离开语音频道", + "commandsVoiceDesc": "机器人语音命令", + "commandsVoiceFemale": "女性", + "commandsVoiceFemaleDescription": "设置语音演员性别为女性", + "commandsVoiceGenderDesc": "设置机器人的语音演员性别。", + "commandsVoiceJoin": "加入名为 {name} 的语音频道,ID 为 {id},位于公会 {guild}", + "commandsVoiceJoinDesc": "加入语音频道", + "commandsVoiceLeave": "离开名为 {name} 的语音频道,ID 为 {id},位于公会 {guild}", + "commandsVoiceLeaveDesc": "离开语音频道", + "commandsVoiceMale": "男性", + "commandsVoiceMaleDescription": "设置语音演员性别为男性", + "commandsVoiceNotInVoice": "你不在语音频道中", + "connect": "连接", + "connectCap": "连接", + "connected": "已连接", + "connectedCap": "已连接", + "connectedToServer": "已连接到服务器。", + "connectingCap": "正在连接", + "connectingToServer": "正在连接到服务器...", + "connectionEvents": "连接事件", + "connectionRefusedTo": "拒绝连接至:{id}。", + "connectionsCap": "连接", + "couldNotAddStepTracers": "无法添加步骤追踪器。", + "couldNotAppendMapMarkers": "无法添加地图标记,rustplus 信息实例未设置。", + "couldNotAppendMapMonuments": "无法添加地图纪念碑,rustplus 信息实例未设置。", + "couldNotAppendMapTracers": "无法添加地图追踪器,rustplus 信息实例未设置。", + "couldNotConnectTo": "无法连接至:{id}。", + "couldNotCreateCategory": "无法创建类别:{name}", + "couldNotCreateTextChannel": "无法创建文本频道:{name}", + "couldNotDeferInteraction": "无法推迟互动。", + "couldNotDeleteCategory": "无法删除类别:{categoryId}", + "couldNotDeleteChannel": "无法删除频道:{channelId}", + "couldNotDeleteMessage": "无法删除消息:{message}", + "couldNotFindAnyPlayers": "找不到任何玩家。", + "couldNotFindCategory": "找不到类别:{category}", + "couldNotFindChannel": "找不到频道:{channel}", + "couldNotFindCraftDetails": "找不到 {name} 的制作详情。", + "couldNotFindDecayDetails": "找不到 {name} 的衰变详情。", + "couldNotFindDespawnDetails": "找不到 {name} 的消失详情。", + "couldNotFindGuild": "找不到公会:{guildId}", + "couldNotFindLanguage": "找不到语言:{language}", + "couldNotFindMessage": "找不到消息 {message}", + "couldNotFindPlayer": "找不到玩家 {name}。", + "couldNotFindPlayerId": "找不到带有 id {id} 的玩家。", + "couldNotFindRecycleDetails": "找不到 {name} 的回收详情。", + "couldNotFindResearchDetails": "找不到 {name} 的研究详情。", + "couldNotFindRole": "找不到角色:{roleId}", + "couldNotFindStackDetails": "找不到 {name} 的堆叠详情。", + "couldNotFindTeammate": "找不到队友:{name}。", + "couldNotFindUpkeepDetails": "找不到 {name} 的维护详情。", + "couldNotFindUser": "找不到用户:{userId}", + "couldNotGetChannelWithId": "无法获取带有 id:{id} 的频道。", + "couldNotIdentifyMember": "无法识别团队成员:{name}。", + "couldNotPerformBulkDelete": "无法在频道:{channel} 上执行批量删除。", + "couldNotPerformMessageDelete": "无法执行消息删除。", + "couldNotPerformMessagesFetch": "无法在频道:{channel} 上执行消息提取。", + "couldNotRegisterSlashCommands": "无法为公会:{guildId} 注册斜杠命令。", + "couldNotSetParent": "无法为频道:{channelId} 设置父级。", + "craft": "制作", + "crate": "箱子", + "createGroupCap": "创建组", + "createTrackerCap": "创建追踪器", + "credentialsAddedSuccessfully": "FCM 凭证已成功添加给 steamId:{steamId}!", + "credentialsAlreadyRegistered": "FCM 凭证已为 steamId:{steamId} 注册!", + "credentialsCannotStartLiteAlreadyHoster": "无法为 steamId:{steamId} 启动 FCM 监听器 Lite。已经是主机。", + "credentialsDoNotExist": "FCM 凭证不存在于 steamId:{steamId}。", + "credentialsHosterNotSetForGuild": "公会 {id} 的 FCM 凭证主机未设置,请设置主机。", + "credentialsNotRegistered": "FCM 凭证未为 steamId:{steamId} 注册!", + "credentialsNotRegisteredForGuild": "公会:{id} 未注册 FCM 凭证,无法启动 FCM 监听器。", + "credentialsRemovedSuccessfully": "FCM 凭证已成功移除 steamId:{steamId}!", + "credentialsSetHosterSuccessfully": "FCM 凭证主机已成功设置为 steamId:{steamId}。", + "currencySign": "货币符号", + "currentCommandDelay": "当前命令延迟:{delay} 秒。", + "currentItemHp": "物品的当前 HP。", + "currentPrefixPlaceholder": "当前前缀:{prefix}", + "customCommand": "自定义命令", + "customTimerEditCargoShipEgressLabel": "货船出口时间(秒):", + "customTimerEditCrateOilRigUnlockLabel": "石油钻井平台锁定箱解锁时间(秒):", + "customTimerEditDesc": "编辑自定义计时器", + "customTimersCap": "自定义计时器", + "dash": "破折号", + "dayOfWipe": "擦拭日 {day}", + "deathCap": "死亡", + "decay": "衰变", + "decayTimeForItem": "物品 {item} 的衰变时间为 {time}。", + "decayingCap": "衰变中", + "deleteUnreachableDevicesCap": "删除无法访问的设备", + "despawnTime": "消失时间", + "despawnTimeOfItem": "物品 {item} 的消失时间为 {time}。", + "deviceIsAlreadyOnOff": "{device} 已经是 {status} 状态。", + "deviceIsCurrentlyOnOff": "{device} 当前是 {status} 状态。", + "deviceWasTurnedOnOff": "{device} 被转换为 {status} 状态。", + "disabledCap": "已禁用", + "discoFloor": "迪斯科舞池", + "disconnectCap": "断开连接", + "disconnected": "已断开连接", + "disconnectedCap": "已断开连接", + "disconnectedFromServer": "已从服务器断开连接。", + "discordCap": "Discord", + "discordUsers": "Discord 用户", + "displayInformationBattlemetricsAllOnlinePlayers": "应该在信息频道显示来自 Battlemetrics 的所有在线玩家吗?", + "displayingMap": "正在显示 {mapName} 地图。", + "displayingOnlinePlayers": "正在显示在线玩家。", + "distanceDirectionGrid": "{distance}米,方向 {direction}° [{grid}]。", + "doorController": "门控制器", + "dot": "点", + "eastOfGrid": "网格东侧", + "editCap": "编辑", + "editing": "正在编辑", + "editingOf": "正在编辑 {entity}", + "egressInTime": "在 {time} 时离开 {location}。", + "eight": "八", + "elevator": "电梯", + "empty": "空的", + "enabledCap": "已启用", + "entityId": "实体 ID", + "equalsSign": "等号", + "errorCap": "错误", + "errorExecutingCommand": "执行此命令时出现错误!", + "eventCap": "事件", + "eventInfo": "事件信息", + "exclamationMark": "感叹号", + "failedToScrapeProfileName": "无法抓取个人资料名称:{link}。", + "failedToScrapeProfilePicture": "无法抓取个人资料图片:{link}。", + "fcmCredentials": "FCM 凭证", + "fcmListenerStartHost": "公会ID为 {guildId},steamId 为 {steamId} 的 FCM 监听器主机将在 5 秒后启动。", + "fcmListenerStartLite": "公会ID为 {guildId},steamId 为 {steamId} 的 FCM 监听器 Lite 将在 5 秒后启动。", + "ferryTerminal": "渡轮码头", + "fishingVillage": "渔村", + "five": "五", + "four": "四", + "giantExcavatorPit": "巨型挖掘机坑", + "greaterThanSign": "大于符号", + "groupAddSwitchDesc": "将开关添加至 {group}", + "groupRemoveSwitchDesc": "从 {group} 移除开关", + "harbor": "港口", + "hasBeenAliveLongest": "{name} 存活时间最长 ({time})。", + "hash": "井号", + "hbhfSensor": "HBHF 传感器", + "heart": "心", + "heater": "加热器", + "heavyScientistCalledSetting": "当重型科学家被召唤至石油钻井平台时发送通知。", + "heavyScientistsCalledLarge": "重型科学家被召唤至大型石油钻井平台 {location}。", + "heavyScientistsCalledSmall": "重型科学家被召唤至小型石油钻井平台 {location}。", + "hideTrademark": "隐藏商标。", + "hoster": "主机", + "hp": "生命值", + "hpExceedMax": "生命值 {hp} 超过最大值 {max}。", + "hqmQuarry": "高质量金属采石场", + "ignoreSetAvatar": "忽略设置头像", + "ignoreSetNickname": "忽略设置昵称", + "ignoreSetUsername": "忽略设置用户名", + "inGameBotMessagesMuted": "游戏内机器人消息已静音。", + "inGameBotMessagesUnmuted": "游戏内机器人消息已取消静音。", + "inGameCap": "游戏内", + "inGameEventInfo": "游戏内事件信息", + "inGameTeamNotificationsSetting": "游戏内团队通知。", + "inGameTime": "游戏内时间:{time}。", + "index": "索引", + "infoCap": "信息", + "inside": "内部", + "interactionEditReplyFailed": "交互编辑回复失败:{error}", + "interactionInvalidChannel": "来自无效频道的交互。", + "interactionReplyFailed": "交互回复失败:{error}", + "interactionUpdateFailed": "交互更新失败:{error}", + "invalidBattlemetricsId": "无效的 Battlemetrics ID。", + "invalidGuildOrChannel": "无效的公会或频道。", + "invalidHpInterval": "无效的 HP 区间 {hp}。", + "invalidId": "无效的 ID:{id}。", + "invalidStructureType": "无效的结构类型 {type}。", + "invalidSubcommand": "无效的子命令。", + "invalidTimeDistance": "无效的时间距离:{distance},之前:{prevTime},现在:{newTime}", + "isDecaying": "{device} 正在衰变!", + "isNoLongerConnected": "{device} 不再电连接!", + "item": "物品", + "itemAvailableInVendingMachine": "{items} 刚在 [{location}] 的自动售货机中上架。", + "itemAvailableNotifyInGameSetting": "订阅列表中的物品在自动售货机中上架时,是否通知游戏内?", + "junkyard": "废品场", + "justSubscribedToItem": "刚订阅物品 {name}。", + "languageCode": "语言代码:{code}", + "languageLangNotSupported": "{language} 语言不受支持。", + "languageNotSupported": "该语言不受支持。", + "largeBarn": "大型谷仓", + "largeFishingVillage": "大型渔村", + "largeOilRig": "大型石油钻井平台", + "largeWoodBox": "大木箱", + "lastTrigger": "最后触发", + "launchSite": "发射场", + "leaderAlreadyLeader": "{name} 已是团队领袖。", + "leaderCommandIsDisabled": "领导命令在设置中已禁用。", + "leaderCommandOnlyWorks": "领导命令只在当前领导是 {name} 时生效。", + "leaderTransferred": "团队领导权已转移给 {name}。", + "leavingMapAt": "在 {location} 离开。", + "lessThanSign": "小于符号", + "lighthouse": "灯塔", + "linkCap": "链接", + "location": "位置", + "lockedCrateLargeOilRigUnlocked": "在 {location} 的大型石油钻井平台上的锁定箱已解锁。", + "lockedCrateOilRigUnlockedSetting": "当石油钻井平台上的锁定箱解锁时发送通知。", + "lockedCrateSmallOilRigUnlocked": "在 {location} 的小型石油钻井平台上的锁定箱已解锁。", + "logDiscordCommand": "Discord 命令 - 公会:{guild},频道:{channel},用户:{user},消息:{message}。", + "logDiscordMessage": "Discord 消息 - 公会:{guild},频道:{channel},用户:{user},消息:{message}。", + "logInGameCommand": "{type} - 命令:{command},用户:{user}。", + "logInGameMessage": "消息:{message},用户:{user}", + "logSmartSwitchGroupValueChange": "智能开关组 - 值:{value}。", + "logSmartSwitchValueChange": "智能开关 - 值:{value}。", + "loggedInAs": "登录为:{name}", + "makeSureApplicationsCommandsEnabled": "确保在创建邀请 URL 时选中 applications.commands。", + "map": "地图", + "mapSalt": "地图盐", + "mapSeed": "地图种子", + "mapSize": "地图大小", + "mapWipeDetectedNotifySetting": "检测到地图擦拭时,应通知 {group} 吗?", + "markerAdded": "在 [{location}] 添加的标记 {name}。", + "markerDoesNotExist": "标记 {name} 不存在。", + "markerLocation": "标记 {name} 在 [{location}],距离 {player} {distance}米,方向 {direction}°。", + "markerRemoved": "在 [{location}] 移除的标记 {name}。", + "message": "消息", + "messageCap": "消息", + "messageDeletedIn30": "此消息将在 30 秒后删除。", + "messageEditFailed": "消息编辑失败:{error}", + "messageReplyFailed": "消息回复失败:{error}", + "messageSendFailed": "消息发送失败:{error}", + "messageWasSent": "消息已发送。", + "militaryTunnel": "军事隧道", + "miningOutpost": "采矿哨站", + "missileSilo": "导弹发射井", + "missingArguments": "缺少参数。", + "missingPermission": "你没有权限执行此操作。", + "missingTimerMessage": "缺少计时器消息。", + "modalValueChange": "模态交互 - 验证 ID:{id},值:{value}。", + "more": "更多", + "morePlayers": "{players} ...{number} 更多。", + "mutedCap": "已静音", + "name": "名称", + "nameChangeHistory": "名称变更历史", + "new": "新的", + "newVendingMachine": "位于 {location} 的新自动售货机。", + "newsCap": "新闻", + "noActiveTimers": "没有活动计时器。", + "noCommandDelay": "没有命令延迟。", + "noCommunicationSmartSwitch": "无法与智能开关 {name} 通信", + "noData": "无数据。", + "noDataOnLargeOilRig": "大型石油钻井平台当前无数据。", + "noDataOnSmallOilRig": "小型石油钻井平台当前无数据。", + "noDelayCap": "无延迟", + "noItemFound": "在任何自动售货机中都找不到物品...", + "noItemWithIdFound": "找不到带有 id {id} 的物品。", + "noItemWithNameFound": "找不到名为 {name} 的物品。", + "noNameIdGiven": "未给出 '名称' 或 'ID'。", + "noOneIsAfk": "没有人暂离。", + "noOneIsOffline": "没有人离线。", + "noOneIsOnline": "没有人在线。", + "noRegisteredConnectionEvents": "尚未注册连接事件。", + "noRegisteredConnectionEventsUser": "尚未为 {user} 注册连接事件。", + "noRegisteredDeathEvents": "尚未注册死亡事件。", + "noRegisteredDeathEventsUser": "尚未为 {user} 注册死亡事件。", + "noRegisteredEvents": "尚未注册事件。", + "noRegisteredMarkers": "没有注册的标记。", + "noSavedNotes": "没有保存的备注。", + "noToolCupboardWereFound": "未找到工具柜监控。", + "none": "无", + "northEast": "东北", + "northOfGrid": "网格北侧", + "northWest": "西北", + "notAValidOrderType": "{order} 不是有效的订单类型。", + "notActive": "未激活。", + "notConnectedToRustServer": "当前未连接至 rust 服务器。", + "notExistInSubscription": "物品 {name} 不在订阅列表中。", + "notFoundCap": "未找到", + "notPartOfRole": "你不是 {role} 角色的一部分,因此你不能运行机器人命令。", + "notShowingCap": "不显示", + "noteCap": "备注", + "noteIdDoesNotExist": "备注 ID:{id} 不存在。", + "noteIdInvalid": "备注 ID 无效。", + "noteIdWasRemoved": "备注 ID:{id} 已移除。", + "noteSaved": "备注已保存。", + "offCap": "关闭", + "offline": "离线", + "offlineTime": "离线时间", + "oilRig": "石油钻井平台", + "old": "旧的", + "onCap": "开启", + "one": "一", + "online": "在线", + "onlineTime": "在线时间", + "onlyOneInTeam": "你是团队中唯一的成员。", + "outpost": "哨所", + "outside": "外部", + "oxumsGasStation": "欧克萨姆加油站", + "pairing": "配对", + "patrolHelicopter": "巡逻直升机", + "patrolHelicopterDestroyedSetting": "当巡逻直升机被摧毁时发送通知。", + "patrolHelicopterDetectedSetting": "检测到巡逻直升机时发送通知。", + "patrolHelicopterEntersMap": "巡逻直升机从 {location} 进入地图。", + "patrolHelicopterLeftMap": "巡逻直升机刚刚在 {location} 离开地图。", + "patrolHelicopterLeftSetting": "巡逻直升机离开地图时发送通知。", + "patrolHelicopterLocatedAt": "巡逻直升机位于 {location}。", + "patrolHelicopterNotCurrentlyOnMap": "巡逻直升机当前不在地图上。", + "patrolHelicopterTakenDown": "巡逻直升机在 {location} 被击落。", + "percentSign": "百分号", + "pipe": "管道", + "playerHasBeenAliveFor": "{name} 已存活 {time}。", + "playerId": "玩家 ID", + "playerJoinedTheTeam": "{name} 加入了团队。", + "playerJustConnected": "{name} 刚刚连接。", + "playerJustConnectedTo": "{name} 刚刚连接到 {server}。", + "playerJustConnectedTracker": "{name} 刚刚通过追踪器 {tracker} 连接。", + "playerJustDied": "{name} 刚刚在 {location} 死亡。", + "playerJustDisconnected": "{name} 刚刚断开连接。", + "playerJustDisconnectedFrom": "{name} 刚刚从 {server} 断开连接。", + "playerJustDisconnectedTracker": "{name} 刚刚从追踪器 {tracker} 断开连接。", + "playerJustReturned": "{name} 刚刚返回({time})。", + "playerJustWentAfk": "{name} 刚刚暂离。", + "playerLeftTheTeam": "{name} 离开了团队。", + "playerNotPairedWithServer": "领导命令无法使用,因为 {name} 未与服务器配对。", + "players": "玩家", + "playersSearch": "玩家搜索", + "plusSign": "加号", + "populationPlayers": "人口:({current}/{max})玩家。", + "populationQueue": "{number} 玩家排队。", + "powerPlant": "发电厂", + "profile": "个人资料", + "proxLocation": "{name} 位于 {caller} {distance}米的方向 {direction}° [{location}]", + "quantity": "数量", + "questionMark": "问号", + "ranch": "牧场", + "ratelimited": "速率限制", + "reconnectingCap": "重新连接", + "reconnectingToServer": "正在重新连接到服务器...", + "recycle": "回收", + "recycleCap": "回收", + "remain": "剩余", + "removePlayerCap": "移除玩家", + "removeSwitchCap": "移除开关", + "removedSubscribeItem": "已从订阅中移除物品 {name}。", + "research": "研究", + "researchTable": "研究表", + "resetSuccess": "成功重置 Discord。", + "responseContainError": "响应包含错误属性,值为:{error}。", + "responseIsEmpty": "响应为空。", + "responseIsUndefined": "响应未定义。", + "responseTimeout": "等待响应时达到超时。", + "resultRecycling": "回收结果", + "roleCleared": "rustplusplus 角色已清除。", + "roleSet": "rustplusplus 角色已设置为 {name}。", + "rustMonument": "Rust 纪念碑", + "rustplusOperational": "RUSTPLUS 运行中。", + "samsite": "地对空导弹站", + "satelliteDish": "卫星天线", + "scrap": "废料", + "searchResult": "物品搜索结果:**{name}**", + "second": "{second} 秒", + "secondCommandDelay": "{second} 秒命令延迟。", + "seconds": "{seconds} 秒", + "secondsCommandDelay": "{seconds} 秒命令延迟。", + "selectInGamePrefixSetting": "选择应使用的游戏内命令前缀:", + "selectLanguageExtendSetting": "确保运行 **/reset discord** 以成功加载新语言。", + "selectLanguageSetting": "选择机器人使用的语言:", + "selectMenuValueChange": "选择菜单交互 - 验证 ID:{id},值:{value}。", + "selectTrademarkSetting": "选择应在每条游戏内消息中显示的商标。", + "sell": "出售", + "semicolon": "分号", + "sentTextToSpeech": "已发送文本到语音。", + "server": "服务器", + "serverId": "服务器 ID", + "serverInfo": "服务器信息", + "serverInvalid": "与服务器的连接似乎无效。尝试重新配对服务器。", + "serverJustOffline": "服务器刚刚离线。", + "serverJustOnline": "服务器刚刚在线。", + "serverStatus": "服务器状态", + "serviceUnavailable": "服务不可用:{error}", + "setBotLanguage": "将机器人语言设置为:{language}。", + "seven": "七", + "sewerBranch": "下水道支路", + "shouldBotBeMutedSetting": "机器人是否应在游戏内静音?", + "shouldCommandsEnabledSetting": "是否应启用游戏内命令?", + "shouldLeaderCommandEnabledSetting": "是否应启用领导命令?", + "shouldLeaderCommandOnlyForPairedSetting": "领导命令是否仅对与服务器配对的人有效?", + "shouldSmartAlarmNotifyNotConnectedSetting": "即使未在连接的 Rust 服务器上设置,智能警报是否也应通知?", + "shouldSmartAlarmsNotifyInGameSetting": "智能警报是否应在游戏内通知?", + "shouldSmartSwitchNotifyInGameWhenChangedFromDiscord": "当从 Discord 更改智能开关和智能开关组时,是否应在游戏内通知?", + "showingBlacklist": "显示黑名单。", + "showingSubscriptionList": "显示订阅列表。", + "sirenLight": "警报灯", + "six": "六", + "slash": "斜杠", + "slashCommandInteraction": "斜杠命令交互 - 公会:{guild},频道:{channel},用户:{user},命令:{command},验证 ID:{id}。", + "slashCommandValueChange": "斜杠命令交互 - 验证 ID:{id},值:{value}。", + "slashCommandsSuccessRegister": "成功为公会:{guildId} 注册应用命令。", + "slots": "插槽", + "smallOilRig": "小型石油钻井平台", + "smartAlarm": "智能警报", + "smartAlarmEditSuccess": "成功编辑智能警报 {name}。", + "smartAlarmNotifyExtendSetting": "- 这些警报通知将使用游戏内给定的智能警报的标题和消息。\n- 这些智能警报可能在 discord 的警报文本频道中不可用。", + "smartDeviceNotFound": "{device} 未找到!要么已被摧毁,要么 {user} 已失去工具柜访问权限。", + "smartSwitch": "智能开关", + "smartSwitchAutoDay": "智能开关仅在白天激活。", + "smartSwitchAutoNight": "智能开关仅在夜晚激活。", + "smartSwitchAutoOff": "智能开关将在更新周期期间自动变为非激活状态。", + "smartSwitchAutoOffAnyOnline": "如果任何队友在线,智能开关将自动变为非激活状态。", + "smartSwitchAutoOffProximity": "如果队友在邻近范围内,智能开关将自动变为非激活状态。", + "smartSwitchAutoOn": "智能开关将在更新周期期间自动激活。", + "smartSwitchAutoOnAnyOnline": "如果任何队友在线,智能开关将自动激活。", + "smartSwitchAutoOnProximity": "如果队友在邻近范围内,智能开关将自动激活。", + "smartSwitchEditProximityLabel": "邻近设置(米):", + "smartSwitchEditSuccess": "成功编辑智能开关 {name}。", + "smartSwitchNormal": "智能开关正常工作。", + "smilyFace": "笑脸", + "somethingWrongWithConnection": "连接出了问题。", + "southEast": "东南", + "southOfGrid": "网格南侧", + "southWest": "西南", + "sprinkler": "洒水器", + "stackSize": "堆叠大小", + "stackSizeOfItem": "物品 {item} 的堆叠大小为 {quantity}x。", + "status": "状态", + "statusNotConnectedToServer": "**状态** `未连接到服务器!`", + "statusNotElectronicallyConnected": "**状态** `未电连接!`", + "statusNotFound": "**状态**:未找到", + "steamId": "SteamID", + "stoneQuarry": "石料采石场", + "storageMonitor": "存储监控", + "storageMonitorEditSuccess": "成功编辑存储监控 {name}。", + "streamerMode": "主播模式", + "subscribeToChangesBattlemetrics": "订阅 Battlemetrics 上的不同更改。", + "subscriptionList": "订阅列表", + "subscriptionListEmpty": "物品订阅列表为空。", + "sulfurQuarry": "硫磺采石场", + "switches": "开关", + "teamMember": "团队成员", + "teamMemberInfo": "团队成员信息", + "theDome": "穹顶", + "theIdOfTheItem": "物品的 ID。", + "theNameOfTheItem": "物品的名称。", + "theNameOfThePlayer": "玩家的名称。", + "three": "三", + "tilde": "波浪号", + "time": "时间", + "timeBeforeCargoEntersEgress": "在 {location} 的货船进入出口阶段前 {time}。", + "timeBeforeCrateAtLargeOilRigUnlocks": "在大型石油钻井平台 ({location}) 上的锁定箱解锁前 {time}。", + "timeBeforeCrateAtSmallOilRigUnlocks": "在小型石油钻井平台 ({location}) 上的锁定箱解锁前 {time}。", + "timeCap": "时间", + "timeFormatInvalid": "时间格式无效。", + "timeLeftTimer": "{id}:剩余时间:{time},消息:{message}", + "timeSinceAlarmWasTriggered": "警报 {alarm} 触发后过去了 {time}。", + "timeSinceCargoLeft": "自货船离开地图后过去了 {time}。", + "timeSinceChinook47OnMap": "自上次支奴干 47 在地图上出现后过去了 {time}。", + "timeSinceHeavyScientistsOnLarge": "自重型科学家上次被召唤至大型石油钻井平台后过去了 {time}。", + "timeSinceHeavyScientistsOnSmall": "自重型科学家上次被召唤至小型石油钻井平台后过去了 {time}。", + "timeSinceLast": "自上次以来过去了 {time}。", + "timeSinceLastEvent": "自上次事件以来过去了 {time}。", + "timeSinceLastSinceDestroyedLong": "自上次巡逻直升机在地图上出现以来过去了 {time1},自它上次被击落以来过去了 {time2}{location}。", + "timeSinceLastSinceDestroyedShort": "自上次以来过去了 {time1}。\n自摧毁以来过去了 {time2}{location}。", + "timeSincePatrolHelicopterWasOnMap": "自巡逻直升机上次在地图上出现以来过去了 {time}。", + "timeSinceWipe": "自擦拭以来过去了 {time}。", + "timeTill": "距离 {event} 的时间", + "timeTillDaylight": "距离白天还有 {time}。", + "timeTillNightfall": "距离夜晚还有 {time}。", + "timeTillStructureDecay": "距离 {type} 墙壁衰变还有 {time}。", + "timeUntilUnlocksAt": "在 {location} 解锁前还有 {time}。", + "timer": "计时器:{message}。", + "timerIdDoesNotExist": "计时器 ID:{id} 不存在。", + "timerIdInvalid": "计时器 ID 无效。", + "timerRemoved": "计时器 ID:{id} 已移除。", + "timerSet": "已为 {time} 设置计时器。", + "tokensDidNotReplenish": "令牌未及时补充。", + "toolCupboard": "工具柜", + "total": "总计", + "tracker": "追踪器", + "trackerAddPlayerDesc": "将玩家添加至 {tracker}", + "trackerRemovePlayerDesc": "从 {tracker} 移除玩家", + "trademarkShownBeforeMessage": "每条游戏内消息前将显示 {trademark}。", + "trainYard": "火车站", + "turnOffCap": "关闭", + "turnOnCap": "开启", + "turningGroupOnOff": "将组 {group} 转换为 {status}。", + "two": "二", + "type": "类型", + "unavailable": "不可用", + "underscore": "下划线", + "underwater": "水下", + "underwaterLab": "水下实验室", + "unhandledRejection": "未处理的拒绝:{error}", + "unknown": "未知", + "unknownInteraction": "未知交互...", + "unmutedCap": "未静音", + "updateCap": "更新", + "upkeep": "维护", + "upkeepForItem": "物品 {item} 的维护费用为 {cost}。", + "userAddedToBlacklist": "{user} 已被添加至黑名单。", + "userAlreadyInBlacklist": "{user} 已在黑名单中。", + "userButtonInteraction": "按钮交互 - 公会:{guild},频道:{channel},用户:{user},自定义 ID:{customid},验证 ID:{id}。", + "userButtonInteractionSuccess": "按钮交互 - 验证 ID:{id} 成功", + "userJustConnected": "{name} 刚刚连接。", + "userModalInteraction": "模态交互 - 公会:{guild},频道:{channel},用户:{user},自定义 ID:{customid},验证 ID:{id}。", + "userModalInteractionSuccess": "模态交互 - 验证 ID:{id} 成功", + "userNotInBlacklist": "{user} 不在黑名单中。", + "userNotRegistered": "{user} 未注册。", + "userPartOfBlacklist": "验证 ID:{id},{user} 是黑名单的一部分。", + "userPartOfBlacklistDiscord": "黑名单用户!公会:{guild},频道:{channel},用户:{user},消息:{message}。", + "userPartOfBlacklistInGame": "黑名单用户!用户:{user},消息:{message}。", + "userRemovedFromBlacklist": "{user} 已从黑名单中移除。", + "userSaid": "{user} 说,{text}", + "userSelectMenuInteraction": "选择菜单交互 - 公会:{guild},频道:{channel},用户:{user},自定义 ID:{customid},验证 ID:{id}。", + "userSelectMenuInteractionSuccess": "选择菜单交互 - 验证 ID:{id} 成功", + "userTurnedOnOffSmartSwitchFromDiscord": "{user} 通过 Discord 将智能开关 {name} 转换为 {status}。", + "userTurnedOnOffSmartSwitchGroupFromDiscord": "{user} 通过 Discord 将智能开关组 {name} 转换为 {status}。", + "value": "值", + "vendingMachine": "自动售货机", + "vendingMachineDetectedSetting": "检测到新自动售货机时发送通知。", + "voiceCap": "语音", + "warningCap": "警告", + "waterTreatmentPlant": "水处理厂", + "websiteCap": "网站", + "websocketClosedBeforeConnection": "WebSocket 在连接建立前已关闭。", + "westOfGrid": "网格西侧", + "wipe": "擦拭", + "wipeDetected": "检测到擦拭!", + "yield": "产量", + "youAreAlreadyLeader": "你已是领导。", + "youAreNotPairedWithServer": "领导命令无法使用,因为你未与服务器配对。" +} From 26788e373fae13b2b47be8a5a55128a680d91f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nard=20Th=C3=A9o?= <58373303+PandeoF1@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:30:19 +0000 Subject: [PATCH 03/35] Add dependabot --- .github/dependabot.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..66ac4e879 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,26 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + + - package-ecosystem: "docker" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + + - package-ecosystem: "github-actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly From ee42eba8c018d49c955033508586d4413dc8364a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nard=20Th=C3=A9o?= <58373303+PandeoF1@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:31:34 +0000 Subject: [PATCH 04/35] Add issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 25 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..681d319c8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: 'bug' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..da3909363 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: 'enhancement' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 0ebae9d49e2677953bc874f7a928aa0925397719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nard=20Th=C3=A9o?= <58373303+PandeoF1@users.noreply.github.com> Date: Mon, 12 Aug 2024 19:32:36 +0200 Subject: [PATCH 05/35] fix: adapt bug_report for nodejs project --- .github/ISSUE_TEMPLATE/bug_report.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 681d319c8..e97e4d93d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -19,7 +19,8 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] +**Environment (please complete the following information):** + - Hosting OS: + - Node Version (node -v): + - NPM Version (npm -v): + - Bot Version (git log -1): \ No newline at end of file From 28730bb36faebd0246170a53c0146a8d99f2baf0 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 24 Aug 2024 13:13:30 +0200 Subject: [PATCH 06/35] add travelingvendor map stuff --- src/languages/en.json | 2 + src/structures/MapMarkers.js | 60 ++++++++++++++++++- .../notificationSettingsTemplate.json | 12 ++++ src/util/constants.js | 2 + 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/languages/en.json b/src/languages/en.json index b523dcd16..d3efe3fe8 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -727,6 +727,8 @@ "trackerRemovePlayerDesc": "Remove Player from {tracker}", "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", + "travelingVendorLocatedAt": "Traveling Vendor is located at {location}.", + "travelingVendorLeftMap" : "Traveling Vendor just left the map at {location}.", "turnOffCap": "TURN OFF", "turnOnCap": "TURN ON", "turningGroupOnOff": "Turning Group {group} {status}.", diff --git a/src/structures/MapMarkers.js b/src/structures/MapMarkers.js index 9726689e1..b6fb41019 100644 --- a/src/structures/MapMarkers.js +++ b/src/structures/MapMarkers.js @@ -37,7 +37,8 @@ class MapMarkers { CargoShip: 5, Crate: 6, GenericRadius: 7, - PatrolHelicopter: 8 + PatrolHelicopter: 8, + TravelingVendor: 9 } this._players = []; @@ -46,6 +47,7 @@ class MapMarkers { this._cargoShips = []; this._genericRadiuses = []; this._patrolHelicopters = []; + this._travelingVendors = []; /* Timers */ this.cargoShipEgressTimers = new Object(); @@ -61,6 +63,7 @@ class MapMarkers { this.timeSinceLargeOilRigWasTriggered = null; this.timeSincePatrolHelicopterWasOnMap = null; this.timeSincePatrolHelicopterWasDestroyed = null; + this.timeSinceTravelingVendorWasOnMap = null; /* Event location */ this.patrolHelicopterDestroyedLocation = null; @@ -92,6 +95,8 @@ class MapMarkers { set genericRadiuses(genericRadiuses) { this._genericRadiuses = genericRadiuses; } get patrolHelicopters() { return this._patrolHelicopters; } set patrolHelicopters(patrolHelicopters) { this._patrolHelicopters = patrolHelicopters; } + get travelingVendors() { return this._travelingVendors; } + set travelingVendors(travelingVendors) { this._travelingVendors = travelingVendors; } getType(type) { if (!Object.values(this.types).includes(type)) { @@ -123,6 +128,10 @@ class MapMarkers { return this.patrolHelicopters; } break; + case this.types.TravelingVendor: { + return this.travelingVendors; + } break; + default: { return null; } break; @@ -254,6 +263,7 @@ class MapMarkers { this.updateCH47s(mapMarkers); this.updateVendingMachines(mapMarkers); this.updateGenericRadiuses(mapMarkers); + this.updateTravelingVendors(mapMarkers); } updatePlayers(mapMarkers) { @@ -701,6 +711,52 @@ class MapMarkers { } } + updateTravelingVendors(mapMarkers) { + let newMarkers = this.getNewMarkersOfTypeId(this.types.TravelingVendor, mapMarkers.markers); + let leftMarkers = this.getLeftMarkersOfTypeId(this.types.TravelingVendor, mapMarkers.markers); + let remainingMarkers = this.getRemainingMarkersOfTypeId(this.types.TravelingVendor, mapMarkers.markers); + + /* TravelingVendor markers that are new. */ + for (let marker of newMarkers) { + let mapSize = this.rustplus.info.correctedMapSize; + let pos = Map.getPos(marker.x, marker.y, mapSize, this.rustplus); + + marker.location = pos; + + this.rustplus.sendEvent( + this.rustplus.notificationSettings.travelingVendorDetectedSetting, + this.client.intlGet(this.rustplus.guildId, 'travelingVendorLocatedAt', { location: pos.string }), + 'vendor', + Constants.COLOR_TRAVELING_VENDOR_LOCATED_AT); + + this.travelingVendors.push(marker); + } + + /* TravelingVendor markers that have left. */ + for (let marker of leftMarkers) { + this.rustplus.sendEvent( + this.rustplus.notificationSettings.travelingVendorLeftSetting, + this.client.intlGet(this.rustplus.guildId, 'travelingVendorLeftMap', { location: marker.location.string }), + 'vendor', + Constants.COLOR_TRAVELING_VENDOR_LEFT_MAP); + + this.timeSinceTravelingVendorWasOnMap = new Date(); + + this.travelingVendors = this.travelingVendors.filter(e => e.id !== marker.id); + } + + /* TravelingVendor markers that still remains. */ + for (let marker of remainingMarkers) { + let mapSize = this.rustplus.info.correctedMapSize; + let pos = Map.getPos(marker.x, marker.y, mapSize, this.rustplus); + let travelingVendor = this.getMarkerByTypeId(this.types.TravelingVendor, marker.id); + + travelingVendor.x = marker.x; + travelingVendor.y = marker.y; + travelingVendor.location = pos; + } + } + /* Timer notification functions */ @@ -784,6 +840,7 @@ class MapMarkers { this.cargoShips = []; this.genericRadiuses = []; this.patrolHelicopters = []; + this.travelingVendors = []; for (const [id, timer] of Object.entries(this.cargoShipEgressTimers)) { timer.stop(); @@ -804,6 +861,7 @@ class MapMarkers { this.timeSinceLargeOilRigWasTriggered = null; this.timeSincePatrolHelicopterWasOnMap = null; this.timeSincePatrolHelicopterWasDestroyed = null; + this.timeSinceTravelingVendorWasOnMap = null; this.patrolHelicopterDestroyedLocation = null; diff --git a/src/templates/notificationSettingsTemplate.json b/src/templates/notificationSettingsTemplate.json index 456c38667..276eeaf0f 100644 --- a/src/templates/notificationSettingsTemplate.json +++ b/src/templates/notificationSettingsTemplate.json @@ -59,6 +59,18 @@ "inGame": false, "voice": true }, + "travelingVendorDetectedSetting": { + "image": "traveling_vendor_logo.png", + "discord": true, + "inGame": false, + "voice": true + }, + "travelingVendorLeftSetting": { + "image": "traveling_vendor_logo.png", + "discord": true, + "inGame": false, + "voice": true + }, "vendingMachineDetectedSetting": { "image": "vending_machine_logo.png", "discord": true, diff --git a/src/util/constants.js b/src/util/constants.js index 22d4b6dd6..4d87883c9 100644 --- a/src/util/constants.js +++ b/src/util/constants.js @@ -101,6 +101,8 @@ module.exports = { COLOR_PATROL_HELICOPTER_TRACER: '#00FF00', COLOR_SETTINGS: '#861C0C', COLOR_TEAMCHAT_DEFAULT: '#CE412B', + COLOR_TRAVELING_VENDOR_LOCATED_AT: '#FFD700', + COLOR_TRAVELING_VENDOR_LEFT_MAP: '#FF4500', GET_STEAM_PROFILE_LINK: function (steamId) { return `[${steamId}](${this.STEAM_PROFILES_URL}${steamId})`; From 6bcb634dc283ff6e2543f8627d5d8b07a8f56e64 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sun, 25 Aug 2024 11:51:11 +0200 Subject: [PATCH 07/35] add traveling vendor commands for ingame and discord --- src/handlers/discordCommandHandler.js | 4 +++ src/handlers/inGameCommandHandler.js | 4 +++ src/languages/en.json | 5 ++++ src/structures/RustPlus.js | 42 +++++++++++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/src/handlers/discordCommandHandler.js b/src/handlers/discordCommandHandler.js index d064a3d61..baf9f6bc4 100644 --- a/src/handlers/discordCommandHandler.js +++ b/src/handlers/discordCommandHandler.js @@ -200,6 +200,10 @@ module.exports = { commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxWipe')}`) { response = rustplus.getCommandWipe(); } + else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxTravelingVendor')}` || + commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxTravelingVendor')}`) { + response = rustplus.getCommandTravelingVendor(); + } else { /* Smart Switches/ Group Switches are not currently supported through discord. */ return false; diff --git a/src/handlers/inGameCommandHandler.js b/src/handlers/inGameCommandHandler.js index 5e0d604d7..41f6b79cf 100644 --- a/src/handlers/inGameCommandHandler.js +++ b/src/handlers/inGameCommandHandler.js @@ -206,6 +206,10 @@ module.exports = { else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxWipe')}` || commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxWipe')}`) { rustplus.sendInGameMessage(rustplus.getCommandWipe()); + } + else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxTravelingVendor')}` || + commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxTravelingVendor')}`) { + rustplus.sendInGameMessage(rustplus.getCommandTravelingVendor()); } else { /* Maybe a custom command? */ diff --git a/src/languages/en.json b/src/languages/en.json index d3efe3fe8..dae25fcb4 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -160,6 +160,7 @@ "commandSyntaxTimers": "timers", "commandSyntaxTranslateFromTo": "trf", "commandSyntaxTranslateTo": "tr", + "commandSyntaxTravelingVendor": "trvendor", "commandSyntaxTwig": "twig", "commandSyntaxUnmute": "unmute", "commandSyntaxUnsubscribe": "unsub", @@ -708,6 +709,7 @@ "timeSinceLastSinceDestroyedLong": "{time1} since the last Patrol Helicopter was on the map, {time2} since it last got downed{location}.", "timeSinceLastSinceDestroyedShort": "{time1} since last.\n{time2} since destroyed{location}.", "timeSincePatrolHelicopterWasOnMap": "{time} since the Patrol Helicopter was on the map.", + "timeSinceTravelingVendorWasOnMap": "{time} since Traveling Vendor was on the map.", "timeSinceWipe": "{time} since wipe.", "timeTill": "Time till {event}", "timeTillDaylight": "{time} before daylight.", @@ -727,8 +729,11 @@ "trackerRemovePlayerDesc": "Remove Player from {tracker}", "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", + "travelingVendorDetectedSetting": "When Traveling Vendor is detected, send a notification.", + "travelingVendorLeftSetting": "When Traveling Vendor left the map, send a notification.", "travelingVendorLocatedAt": "Traveling Vendor is located at {location}.", "travelingVendorLeftMap" : "Traveling Vendor just left the map at {location}.", + "travelingVendorNotCurrentlyOnMap": "Traveling Vendor is not currently on the map.", "turnOffCap": "TURN OFF", "turnOnCap": "TURN ON", "turningGroupOnOff": "Turning Group {group} {status}.", diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js index b3e97c6e9..8e7e97051 100644 --- a/src/structures/RustPlus.js +++ b/src/structures/RustPlus.js @@ -2704,6 +2704,48 @@ class RustPlus extends RustPlusLib { }); } } + + getCommandTravelingVendor(isInfoChannel = false) { + const strings = []; + for (const travelingVendor of this.mapMarkers.travelingVendor) { + if (isInfoChannel) { + return Client.client.intlGet(this.guildId, 'atLocation', { + location: travelingVendor.location.string + }); + } + else { + strings.push(Client.client.intlGet(this.guildId, 'travelingVendorLocatedAt', { + location: travelingVendor.location.string + })); + } + } + + if (strings.length === 0) { + const wasOnMap = this.mapMarkers.timeSincePatrolHelicopterWasOnMap; + + if (wasOnMap == null) { + return isInfoChannel ? Client.client.intlGet(this.guildId, 'notActive') : + Client.client.intlGet(this.guildId, 'travelingVendorNotCurrentlyOnMap'); + } + else if (wasOnMap !== null) { + const secondsSince = (new Date() - wasOnMap) / 1000; + if (isInfoChannel) { + const timeSince = Timer.secondsToFullScale(secondsSince, 's'); + return Client.client.intlGet(this.guildId, 'timeSinceLast', { + time: timeSince + }); + } + else { + const timeSince = Timer.secondsToFullScale(secondsSince); + return Client.client.intlGet(this.guildId, 'timeSinceTravelingVendorWasOnMap', { + time: timeSince + }); + } + } + } + + return strings; + } } module.exports = RustPlus; From 10f299bfa953e592bf44a08e86ccb24d93c05295 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Wed, 4 Sep 2024 22:24:49 +0200 Subject: [PATCH 08/35] fixes and img change for testing --- src/handlers/inGameCommandHandler.js | 2 +- src/languages/en.json | 12 ++++++------ src/structures/RustPlus.js | 4 ++-- src/templates/notificationSettingsTemplate.json | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/handlers/inGameCommandHandler.js b/src/handlers/inGameCommandHandler.js index 41f6b79cf..8d606ef74 100644 --- a/src/handlers/inGameCommandHandler.js +++ b/src/handlers/inGameCommandHandler.js @@ -206,7 +206,7 @@ module.exports = { else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxWipe')}` || commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxWipe')}`) { rustplus.sendInGameMessage(rustplus.getCommandWipe()); - } + } else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxTravelingVendor')}` || commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxTravelingVendor')}`) { rustplus.sendInGameMessage(rustplus.getCommandTravelingVendor()); diff --git a/src/languages/en.json b/src/languages/en.json index dae25fcb4..3ab1a4562 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -709,7 +709,7 @@ "timeSinceLastSinceDestroyedLong": "{time1} since the last Patrol Helicopter was on the map, {time2} since it last got downed{location}.", "timeSinceLastSinceDestroyedShort": "{time1} since last.\n{time2} since destroyed{location}.", "timeSincePatrolHelicopterWasOnMap": "{time} since the Patrol Helicopter was on the map.", - "timeSinceTravelingVendorWasOnMap": "{time} since Traveling Vendor was on the map.", + "timeSinceTravelingVendorWasOnMap": "{time} since the Traveling Vendor was on the map.", "timeSinceWipe": "{time} since wipe.", "timeTill": "Time till {event}", "timeTillDaylight": "{time} before daylight.", @@ -729,11 +729,11 @@ "trackerRemovePlayerDesc": "Remove Player from {tracker}", "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", - "travelingVendorDetectedSetting": "When Traveling Vendor is detected, send a notification.", - "travelingVendorLeftSetting": "When Traveling Vendor left the map, send a notification.", - "travelingVendorLocatedAt": "Traveling Vendor is located at {location}.", - "travelingVendorLeftMap" : "Traveling Vendor just left the map at {location}.", - "travelingVendorNotCurrentlyOnMap": "Traveling Vendor is not currently on the map.", + "travelingVendorDetectedSetting": "When the Traveling Vendor is detected, send a notification.", + "travelingVendorLeftSetting": "When the Traveling Vendor left the map, send a notification.", + "travelingVendorLocatedAt": "The Traveling Vendor is located at {location}.", + "travelingVendorLeftMap" : "The Traveling Vendor just left the map at {location}.", + "travelingVendorNotCurrentlyOnMap": "The Traveling Vendor is not currently on the map.", "turnOffCap": "TURN OFF", "turnOnCap": "TURN ON", "turningGroupOnOff": "Turning Group {group} {status}.", diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js index 8e7e97051..f2161c500 100644 --- a/src/structures/RustPlus.js +++ b/src/structures/RustPlus.js @@ -2707,7 +2707,7 @@ class RustPlus extends RustPlusLib { getCommandTravelingVendor(isInfoChannel = false) { const strings = []; - for (const travelingVendor of this.mapMarkers.travelingVendor) { + for (const travelingVendor of this.mapMarkers.travelingVendors) { if (isInfoChannel) { return Client.client.intlGet(this.guildId, 'atLocation', { location: travelingVendor.location.string @@ -2721,7 +2721,7 @@ class RustPlus extends RustPlusLib { } if (strings.length === 0) { - const wasOnMap = this.mapMarkers.timeSincePatrolHelicopterWasOnMap; + const wasOnMap = this.mapMarkers.timeSinceTravelingVendorWasOnMap; if (wasOnMap == null) { return isInfoChannel ? Client.client.intlGet(this.guildId, 'notActive') : diff --git a/src/templates/notificationSettingsTemplate.json b/src/templates/notificationSettingsTemplate.json index 276eeaf0f..87b69de0a 100644 --- a/src/templates/notificationSettingsTemplate.json +++ b/src/templates/notificationSettingsTemplate.json @@ -60,13 +60,13 @@ "voice": true }, "travelingVendorDetectedSetting": { - "image": "traveling_vendor_logo.png", + "image": "chinook_47_logo.png", "discord": true, "inGame": false, "voice": true }, "travelingVendorLeftSetting": { - "image": "traveling_vendor_logo.png", + "image": "chinook_47_logo.png", "discord": true, "inGame": false, "voice": true From 13665cf37fc73a5f51a3c47780f7a8265d04fdbc Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Tue, 10 Sep 2024 13:40:28 +0200 Subject: [PATCH 09/35] changed the traveling vendor command from trvendor to vendor --- src/languages/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.json b/src/languages/en.json index 3ab1a4562..4784aec14 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -160,7 +160,7 @@ "commandSyntaxTimers": "timers", "commandSyntaxTranslateFromTo": "trf", "commandSyntaxTranslateTo": "tr", - "commandSyntaxTravelingVendor": "trvendor", + "commandSyntaxTravelingVendor": "vendor", "commandSyntaxTwig": "twig", "commandSyntaxUnmute": "unmute", "commandSyntaxUnsubscribe": "unsub", From 631ed492e3075ac33a5187be237e388541080f34 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Tue, 10 Sep 2024 13:53:42 +0200 Subject: [PATCH 10/35] updated image links for the discord embed --- src/templates/notificationSettingsTemplate.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/templates/notificationSettingsTemplate.json b/src/templates/notificationSettingsTemplate.json index 87b69de0a..069e2e140 100644 --- a/src/templates/notificationSettingsTemplate.json +++ b/src/templates/notificationSettingsTemplate.json @@ -60,13 +60,13 @@ "voice": true }, "travelingVendorDetectedSetting": { - "image": "chinook_47_logo.png", + "image": "traveling_vendor_logo.png", "discord": true, "inGame": false, "voice": true }, "travelingVendorLeftSetting": { - "image": "chinook_47_logo.png", + "image": "traveling_vendor_logo.png", "discord": true, "inGame": false, "voice": true From 797b9d468ba628c837ca15d5bc7e8bfc3ba053ae Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Tue, 10 Sep 2024 14:14:58 +0200 Subject: [PATCH 11/35] update docs for traveling vendor --- docs/commands.md | 9 +++++++++ docs/full_list_features.md | 1 + docs/images/ingame_commands/vendor_ingame.png | Bin 0 -> 140894 bytes 3 files changed, 10 insertions(+) create mode 100644 docs/images/ingame_commands/vendor_ingame.png diff --git a/docs/commands.md b/docs/commands.md index 220bc2cfa..4fba17110 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -387,6 +387,7 @@ In-Game Command | Description [**unmute**](commands.md#unmute) | Unmute the bot from the In-Game Team Chat. [**upkeep**](commands.md#upkeep) | Get the upkeep time of all connected tool cupboard monitors. [**uptime**](commands.md#uptime-ingame) | Display uptime of the bot and server. +[**vendor**](commands.md#vendor) | Get information about the Traveling Vendor (Current Location, Time since last vendor) [**wipe**](commands.md#wipe) | Get the time since it was wiped. @@ -722,6 +723,14 @@ Subcommand | Description | Required ![In-Game Command uptime Image](images/ingame_commands/uptime_ingame.png) +## **vendor** + +> **Get information about the Traveling Vendor (Current Location, Time since last Traveling Vendor).** +
Command: `!vendor` + +![In-Game Command vendor Image](images/ingame_commands/vendor_ingame.png) + + ## **wipe** > **Get the time since it was wiped.** diff --git a/docs/full_list_features.md b/docs/full_list_features.md index d1943c2de..6ba8c5996 100644 --- a/docs/full_list_features.md +++ b/docs/full_list_features.md @@ -60,6 +60,7 @@ - **unmute** - Unmute rustplusplus In-Game. - **upkeep** - Check upkeep of Storage Monitor Tool Cupboards. - **uptime** - Display the uptime of rustplusplus and currently connected server. +- **vendor** - Get information regarding the Traveling Vendor - **wipe** - Display time since wipe. ## Smart Devices diff --git a/docs/images/ingame_commands/vendor_ingame.png b/docs/images/ingame_commands/vendor_ingame.png new file mode 100644 index 0000000000000000000000000000000000000000..dd52e69d7f11ce39716b35b0bd23f96496d565f3 GIT binary patch literal 140894 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 J;LG6s+jiGYH7Rf>y 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

yo;m~dJE4i@8sLWIJP8`xVxsORPGlw3O}kI%qM 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 Date: Wed, 18 Sep 2024 17:52:59 +0200 Subject: [PATCH 12/35] changed spawned event message --- src/languages/en.json | 1 + src/structures/MapMarkers.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/languages/en.json b/src/languages/en.json index 4784aec14..736b0ea73 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -734,6 +734,7 @@ "travelingVendorLocatedAt": "The Traveling Vendor is located at {location}.", "travelingVendorLeftMap" : "The Traveling Vendor just left the map at {location}.", "travelingVendorNotCurrentlyOnMap": "The Traveling Vendor is not currently on the map.", + "travelingVendorSpawnedAt": "The Traveling Vendor spawned at {location}.", "turnOffCap": "TURN OFF", "turnOnCap": "TURN ON", "turningGroupOnOff": "Turning Group {group} {status}.", diff --git a/src/structures/MapMarkers.js b/src/structures/MapMarkers.js index b6fb41019..d04094f2e 100644 --- a/src/structures/MapMarkers.js +++ b/src/structures/MapMarkers.js @@ -725,7 +725,7 @@ class MapMarkers { this.rustplus.sendEvent( this.rustplus.notificationSettings.travelingVendorDetectedSetting, - this.client.intlGet(this.rustplus.guildId, 'travelingVendorLocatedAt', { location: pos.string }), + this.client.intlGet(this.rustplus.guildId, 'travelingVendorSpawnedAt', { location: pos.string }), 'vendor', Constants.COLOR_TRAVELING_VENDOR_LOCATED_AT); From 56f253dd2f4eed4881ed1fdabc5d11865a02124c Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Wed, 18 Sep 2024 18:02:36 +0200 Subject: [PATCH 13/35] add vendor image. thanks to davinator for the image --- .../images/events/traveling_vendor_logo.png | Bin 0 -> 9975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/resources/images/events/traveling_vendor_logo.png diff --git a/src/resources/images/events/traveling_vendor_logo.png b/src/resources/images/events/traveling_vendor_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f6632756665a13b214da2f9cd371071605c9ddc2 GIT binary patch literal 9975 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 literal 0 HcmV?d00001 From ec62adf7067a67c1432ed4f90f79557226a9cbdd Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Thu, 26 Sep 2024 17:16:02 +0200 Subject: [PATCH 14/35] add cargoship/vendor translation --- src/languages/zh.json | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/languages/zh.json b/src/languages/zh.json index 70aab4b31..82313734e 100644 --- a/src/languages/zh.json +++ b/src/languages/zh.json @@ -69,12 +69,15 @@ "cargoLeavingMapAt": "货船将在 {location} 离开地图。", "cargoLocatedAt": "货船位于 {location}。", "cargoNotCurrentlyOnMap": "货船当前不在地图上。", - "cargoShipDetectedSetting": "检测到货船时发送通知。", - "cargoShipEgressSetting": "货船进入出口阶段时发送通知。", - "cargoShipEntersEgressStage": "货船应在 {location} 进入出口阶段。", + "cargoShipDetectedSetting": "当发现货船时,发送通知。", + "cargoShipDockingAtHarbor": "货船刚刚停靠在港口,位置是 {location}", + "cargoShipDockingAtHarborSetting": "当货船停靠在港口时,发送通知。", + "cargoShipEgressSetting": "当货船进入退出阶段时,发送通知。", + "cargoShipEntersEgressStage": "货船应该位于退出阶段,位置是 {location}。", "cargoShipEntersMap": "货船从 {location} 进入地图。", - "cargoShipLeftMap": "货船刚刚在 {location} 离开地图。", - "cargoShipLeftSetting": "货船离开地图时发送通知。", + "cargoShipLeftHarbor": "货船刚刚离开了港口,位置是 {location}", + "cargoShipLeftMap": "货船刚刚离开了地图,位置是 {location}。", + "cargoShipLeftSetting": "当货船离开地图时,发送通知。", "cargoShipLocated": "货船位于 {location}。", "cargoship": "货船", "ceilingLight": "天花板灯", @@ -217,6 +220,7 @@ "commandsPlayersPlayerIdDesc": "根据玩家 ID 在 Battlemetrics 上搜索玩家。", "commandsPlayersPlayerIdPlayerIdDesc": "玩家的玩家 ID。", "commandsPlayersStatusDesc": "搜索在线/离线/任何状态的玩家。", + "commandsRecycleRecyclerTypeDesc": "回收机类型(回收机、粉碎机、安全区回收机)。", "commandsRecycleDesc": "显示回收物品的输出。", "commandsRecycleQuantityDesc": "回收物品的数量。", "commandsResearchDesc": "显示研究物品的成本。", @@ -577,6 +581,7 @@ "reconnectingCap": "重新连接", "reconnectingToServer": "正在重新连接到服务器...", "recycle": "回收", + "recycler": "回收机", "recycleCap": "回收", "remain": "剩余", "removePlayerCap": "移除玩家", @@ -594,6 +599,7 @@ "roleSet": "rustplusplus 角色已设置为 {name}。", "rustMonument": "Rust 纪念碑", "rustplusOperational": "RUSTPLUS 运行中。", + "safe-zone-recycler": "安全区回收机", "samsite": "地对空导弹站", "satelliteDish": "卫星天线", "scrap": "废料", @@ -630,6 +636,7 @@ "shouldSmartSwitchNotifyInGameWhenChangedFromDiscord": "当从 Discord 更改智能开关和智能开关组时,是否应在游戏内通知?", "showingBlacklist": "显示黑名单。", "showingSubscriptionList": "显示订阅列表。", + "shredder": "礤床儿", "sirenLight": "警报灯", "six": "六", "slash": "斜杠", @@ -720,6 +727,12 @@ "trackerRemovePlayerDesc": "从 {tracker} 移除玩家", "trademarkShownBeforeMessage": "每条游戏内消息前将显示 {trademark}。", "trainYard": "火车站", + "travelingVendorDetectedSetting": "当发现旅行商贩时,发送通知。", + "travelingVendorLeftSetting": "当旅行商贩离开地图时,发送通知。", + "travelingVendorLocatedAt": "旅行商贩位于 {location}。", + "travelingVendorLeftMap": "旅行商贩刚刚离开了地图,位置是 {location}。", + "travelingVendorNotCurrentlyOnMap": "旅行商贩目前不在地图上。", + "travelingVendorSpawnedAt": "旅行商贩出现在 {location}。", "turnOffCap": "关闭", "turnOnCap": "开启", "turningGroupOnOff": "将组 {group} 转换为 {status}。", From 70efbd866ec4d69ed679ac216ece31ca88737057 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Thu, 26 Sep 2024 17:21:11 +0200 Subject: [PATCH 15/35] add voice actors --- src/staticFiles/actors.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/staticFiles/actors.json b/src/staticFiles/actors.json index e1e978022..dcef03eed 100644 --- a/src/staticFiles/actors.json +++ b/src/staticFiles/actors.json @@ -42,5 +42,9 @@ "tr":{ "male": "Mehmet", "female": "Miray" + }, + "zh":{ + "male": "cmn-CN-Wavenet-B", + "female": "Zhiyu" } } \ No newline at end of file From e23a34ac2a8e471d346db32ad5d8b4a9fcbae018 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 28 Sep 2024 22:26:44 +0200 Subject: [PATCH 16/35] added halted and moving again setting --- src/languages/en.json | 2 ++ src/structures/MapMarkers.js | 23 +++++++++++++++++++ .../notificationSettingsTemplate.json | 6 +++++ src/util/constants.js | 6 +++-- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/languages/en.json b/src/languages/en.json index 736b0ea73..6a610d26a 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -730,10 +730,12 @@ "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", "travelingVendorDetectedSetting": "When the Traveling Vendor is detected, send a notification.", + "travelingVendorHaltedAt": "The Traveling Vendor stoped at {location}.", "travelingVendorLeftSetting": "When the Traveling Vendor left the map, send a notification.", "travelingVendorLocatedAt": "The Traveling Vendor is located at {location}.", "travelingVendorLeftMap" : "The Traveling Vendor just left the map at {location}.", "travelingVendorNotCurrentlyOnMap": "The Traveling Vendor is not currently on the map.", + "travelingVendorResumedAt": "The Traveling Vendor resumed moving at {location}.", "travelingVendorSpawnedAt": "The Traveling Vendor spawned at {location}.", "turnOffCap": "TURN OFF", "turnOnCap": "TURN ON", diff --git a/src/structures/MapMarkers.js b/src/structures/MapMarkers.js index d04094f2e..6709e24ba 100644 --- a/src/structures/MapMarkers.js +++ b/src/structures/MapMarkers.js @@ -722,6 +722,7 @@ class MapMarkers { let pos = Map.getPos(marker.x, marker.y, mapSize, this.rustplus); marker.location = pos; + marker.isHalted = false; this.rustplus.sendEvent( this.rustplus.notificationSettings.travelingVendorDetectedSetting, @@ -751,6 +752,28 @@ class MapMarkers { let pos = Map.getPos(marker.x, marker.y, mapSize, this.rustplus); let travelingVendor = this.getMarkerByTypeId(this.types.TravelingVendor, marker.id); + /* If TravelingVendor is halted */ + if (!this.rustplus.isFirstPoll && !travelingVendor.isHalted) { + if (marker.x === travelingVendor.x && marker.y === travelingVendor.y) { + travelingVendor.isHalted = true; + this.rustplus.sendEvent( + this.rustplus.notificationSettings.travelingVendorHaltedSetting, + this.client.intlGet(this.rustplus.guildId, 'travelingVendorHaltedAt', { location: pos.string }), + 'vendor', + Constants.COLOR_TRAVELING_VENDOR_HALTED); + } + } + /* If TravelingVendor is moving again */ + else if (!this.rustplus.isFirstPoll && travelingVendor.isHalted) { + if (marker.x !== travelingVendor.x || marker.y !== travelingVendor.y) { + travelingVendor.isHalted = false; + this.rustplus.sendEvent( + this.rustplus.notificationSettings.travelingVendorHaltedSetting, + this.client.intlGet(this.rustplus.guildId, 'travelingVendorResumedAt', { location: pos.string }), + 'vendor', + Constants.COLOR_TRAVELING_VENDOR_MOVING); + } + } travelingVendor.x = marker.x; travelingVendor.y = marker.y; travelingVendor.location = pos; diff --git a/src/templates/notificationSettingsTemplate.json b/src/templates/notificationSettingsTemplate.json index 069e2e140..c8587b33f 100644 --- a/src/templates/notificationSettingsTemplate.json +++ b/src/templates/notificationSettingsTemplate.json @@ -65,6 +65,12 @@ "inGame": false, "voice": true }, + "travelingVendorHaltedSetting": { + "image": "traveling_vendor_logo.png", + "discord": true, + "inGame": false, + "voice": true + }, "travelingVendorLeftSetting": { "image": "traveling_vendor_logo.png", "discord": true, diff --git a/src/util/constants.js b/src/util/constants.js index 4d87883c9..61e3b9158 100644 --- a/src/util/constants.js +++ b/src/util/constants.js @@ -101,8 +101,10 @@ module.exports = { COLOR_PATROL_HELICOPTER_TRACER: '#00FF00', COLOR_SETTINGS: '#861C0C', COLOR_TEAMCHAT_DEFAULT: '#CE412B', - COLOR_TRAVELING_VENDOR_LOCATED_AT: '#FFD700', - COLOR_TRAVELING_VENDOR_LEFT_MAP: '#FF4500', + COLOR_TRAVELING_VENDOR_HALTED: '#98C4D8', + COLOR_TRAVELING_VENDOR_LOCATED_AT: '#F4A3E2', + COLOR_TRAVELING_VENDOR_LEFT_MAP: '#5A3E9A', + COLOR_TRAVELING_VENDOR_MOVING: '#7FCE41', GET_STEAM_PROFILE_LINK: function (steamId) { return `[${steamId}](${this.STEAM_PROFILES_URL}${steamId})`; From edac1c36070357e7a0bdf78584fa8f947a35fb4b Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 28 Sep 2024 22:35:53 +0200 Subject: [PATCH 17/35] added missing translation --- src/languages/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/languages/en.json b/src/languages/en.json index 6a610d26a..ec092dc3a 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -731,6 +731,7 @@ "trainYard": "Train Yard", "travelingVendorDetectedSetting": "When the Traveling Vendor is detected, send a notification.", "travelingVendorHaltedAt": "The Traveling Vendor stoped at {location}.", + "travelingVendorHaltedSetting": "When the Traveling Vendor stops moving, send a notification.", "travelingVendorLeftSetting": "When the Traveling Vendor left the map, send a notification.", "travelingVendorLocatedAt": "The Traveling Vendor is located at {location}.", "travelingVendorLeftMap" : "The Traveling Vendor just left the map at {location}.", From c94daddc7c7101be7b45bdbe143924a8b90a71bc Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 28 Sep 2024 23:36:30 +0200 Subject: [PATCH 18/35] fixxed misspell --- src/languages/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.json b/src/languages/en.json index ec092dc3a..b1a3e19bd 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -730,7 +730,7 @@ "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", "travelingVendorDetectedSetting": "When the Traveling Vendor is detected, send a notification.", - "travelingVendorHaltedAt": "The Traveling Vendor stoped at {location}.", + "travelingVendorHaltedAt": "The Traveling Vendor stopped at {location}.", "travelingVendorHaltedSetting": "When the Traveling Vendor stops moving, send a notification.", "travelingVendorLeftSetting": "When the Traveling Vendor left the map, send a notification.", "travelingVendorLocatedAt": "The Traveling Vendor is located at {location}.", From b1d1de530eac42541972135222a36256acaed9c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Tue, 1 Oct 2024 18:55:38 +0200 Subject: [PATCH 19/35] Update FcmListener.js --- src/util/FcmListener.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/FcmListener.js b/src/util/FcmListener.js index cdaab1b22..96e176476 100644 --- a/src/util/FcmListener.js +++ b/src/util/FcmListener.js @@ -91,7 +91,7 @@ module.exports = async (client, guild) => { const body = JSON.parse(bodyCheck.value); - if (!body.type) { + if (!body.type && channelId !== 'alarm') { client.log('FCM Host', `GuildID: ${guild.id}, SteamID: ${hoster}, body type could not be found.`) return; } @@ -540,4 +540,4 @@ async function teamLogin(client, guild, title, message, body) { // } // // await DiscordMessages.sendMessage(guild.id, content, null, instance.channelId.activity); -//} \ No newline at end of file +//} From 7d2637e0aad15b7d7ff4bc4b90a8b2e4cdd33154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Tue, 1 Oct 2024 18:55:52 +0200 Subject: [PATCH 20/35] Update FcmListenerLite.js --- src/util/FcmListenerLite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/FcmListenerLite.js b/src/util/FcmListenerLite.js index 6aec89e1c..676e7568d 100644 --- a/src/util/FcmListenerLite.js +++ b/src/util/FcmListenerLite.js @@ -88,7 +88,7 @@ module.exports = async (client, guild, steamId) => { const body = JSON.parse(bodyCheck.value); - if (!body.type) { + if (!body.type && channelId !== 'alarm') { client.log('FCM LITE', `GuildID: ${guild.id}, SteamID: ${hoster}, body type could not be found.`) return; } From 147599b8f82a7aaabd40983ae76bf3647d382a83 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 12 Oct 2024 05:39:37 +0200 Subject: [PATCH 21/35] add information embed --- src/discordTools/discordEmbeds.js | 5 ++++- src/languages/en.json | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/discordTools/discordEmbeds.js b/src/discordTools/discordEmbeds.js index ee2647e16..13773786f 100644 --- a/src/discordTools/discordEmbeds.js +++ b/src/discordTools/discordEmbeds.js @@ -759,12 +759,14 @@ module.exports = { const smallOilRigFieldName = Client.client.intlGet(guildId, 'smallOilRig'); const largeOilRigFieldName = Client.client.intlGet(guildId, 'largeOilRig'); const chinook47FieldName = Client.client.intlGet(guildId, 'chinook47'); + const travelingVenderFieldName = Client.client.intlGet(guildId, 'travelingVendor'); const cargoShipMessage = rustplus.getCommandCargo(true); const patrolHelicopterMessage = rustplus.getCommandHeli(true); const smallOilMessage = rustplus.getCommandSmall(true); const largeOilMessage = rustplus.getCommandLarge(true); const ch47Message = rustplus.getCommandChinook(true); + const travelingVenderMessage = rustplus.getCommandTravelingVendor(true); return module.exports.getEmbed({ title: Client.client.intlGet(guildId, 'eventInfo'), @@ -777,7 +779,8 @@ module.exports = { { name: patrolHelicopterFieldName, value: `\`${patrolHelicopterMessage}\``, inline: true }, { name: smallOilRigFieldName, value: `\`${smallOilMessage}\``, inline: true }, { name: largeOilRigFieldName, value: `\`${largeOilMessage}\``, inline: true }, - { name: chinook47FieldName, value: `\`${ch47Message}\``, inline: true }], + { name: chinook47FieldName, value: `\`${ch47Message}\``, inline: true }, + { name: travelingVenderFieldName, value: `\`${travelingVenderMessage}\``, inline: true }], timestamp: true }); }, diff --git a/src/languages/en.json b/src/languages/en.json index b1a3e19bd..bb5fb961d 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -729,6 +729,7 @@ "trackerRemovePlayerDesc": "Remove Player from {tracker}", "trademarkShownBeforeMessage": "{trademark} will be shown before messages.", "trainYard": "Train Yard", + "travelingVendor": "Traveling Vendor", "travelingVendorDetectedSetting": "When the Traveling Vendor is detected, send a notification.", "travelingVendorHaltedAt": "The Traveling Vendor stopped at {location}.", "travelingVendorHaltedSetting": "When the Traveling Vendor stops moving, send a notification.", From 2856cc04ddeb00c1a79e27a570cb573d100e7f72 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 12 Oct 2024 22:59:27 +0200 Subject: [PATCH 22/35] vender -> vendor --- src/discordTools/discordEmbeds.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/discordTools/discordEmbeds.js b/src/discordTools/discordEmbeds.js index 13773786f..c47e46359 100644 --- a/src/discordTools/discordEmbeds.js +++ b/src/discordTools/discordEmbeds.js @@ -759,14 +759,14 @@ module.exports = { const smallOilRigFieldName = Client.client.intlGet(guildId, 'smallOilRig'); const largeOilRigFieldName = Client.client.intlGet(guildId, 'largeOilRig'); const chinook47FieldName = Client.client.intlGet(guildId, 'chinook47'); - const travelingVenderFieldName = Client.client.intlGet(guildId, 'travelingVendor'); + const travelingVendorFieldName = Client.client.intlGet(guildId, 'travelingVendor'); const cargoShipMessage = rustplus.getCommandCargo(true); const patrolHelicopterMessage = rustplus.getCommandHeli(true); const smallOilMessage = rustplus.getCommandSmall(true); const largeOilMessage = rustplus.getCommandLarge(true); const ch47Message = rustplus.getCommandChinook(true); - const travelingVenderMessage = rustplus.getCommandTravelingVendor(true); + const travelingVendorMessage = rustplus.getCommandTravelingVendor(true); return module.exports.getEmbed({ title: Client.client.intlGet(guildId, 'eventInfo'), @@ -780,7 +780,7 @@ module.exports = { { name: smallOilRigFieldName, value: `\`${smallOilMessage}\``, inline: true }, { name: largeOilRigFieldName, value: `\`${largeOilMessage}\``, inline: true }, { name: chinook47FieldName, value: `\`${ch47Message}\``, inline: true }, - { name: travelingVenderFieldName, value: `\`${travelingVenderMessage}\``, inline: true }], + { name: travelingVendorFieldName, value: `\`${travelingVendorMessage}\``, inline: true }], timestamp: true }); }, From b119c3f127160e40a0f638564ccd0a30786287e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Sat, 12 Oct 2024 23:07:45 +0200 Subject: [PATCH 23/35] Update lint.yml --- .github/workflows/lint.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8eefaff31..eab0101e9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,10 +8,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [ 14, 16, 18 ] + node: [18, 20, 22 ] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v4.2.1 + - uses: actions/setup-node@v4.0.4 with: node-version: ${{ matrix.node }} cache: 'npm' From 892ddfd71a7d4050e782248ed2ddaca8d983476d Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sun, 27 Oct 2024 08:42:43 +0100 Subject: [PATCH 24/35] add missing zh translation --- src/languages/zh.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/languages/zh.json b/src/languages/zh.json index 82313734e..a8a484583 100644 --- a/src/languages/zh.json +++ b/src/languages/zh.json @@ -727,6 +727,7 @@ "trackerRemovePlayerDesc": "从 {tracker} 移除玩家", "trademarkShownBeforeMessage": "每条游戏内消息前将显示 {trademark}。", "trainYard": "火车站", + "travelingVendor": "旅行中的商贩", "travelingVendorDetectedSetting": "当发现旅行商贩时,发送通知。", "travelingVendorLeftSetting": "当旅行商贩离开地图时,发送通知。", "travelingVendorLocatedAt": "旅行商贩位于 {location}。", From d38bf8f7e34f3b17a600022d6a3e5cd4fa3d1fb7 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Mon, 28 Oct 2024 09:18:46 +0100 Subject: [PATCH 25/35] changed/added missing translations (zh) --- src/languages/zh.json | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/languages/zh.json b/src/languages/zh.json index a8a484583..fa6a757b8 100644 --- a/src/languages/zh.json +++ b/src/languages/zh.json @@ -160,6 +160,7 @@ "commandSyntaxTimers": "计时器", "commandSyntaxTranslateFromTo": "翻译从...到...", "commandSyntaxTranslateTo": "翻译至", + "commandSyntaxTravelingVendor": "供应商", "commandSyntaxTwig": "枝条", "commandSyntaxUnmute": "取消静音", "commandSyntaxUnsubscribe": "取消订阅", @@ -708,6 +709,7 @@ "timeSinceLastSinceDestroyedLong": "自上次巡逻直升机在地图上出现以来过去了 {time1},自它上次被击落以来过去了 {time2}{location}。", "timeSinceLastSinceDestroyedShort": "自上次以来过去了 {time1}。\n自摧毁以来过去了 {time2}{location}。", "timeSincePatrolHelicopterWasOnMap": "自巡逻直升机上次在地图上出现以来过去了 {time}。", + "timeSinceTravelingVendorWasOnMap": "{time} 已经过去,自流动商人上次出现在地图上。", "timeSinceWipe": "自擦拭以来过去了 {time}。", "timeTill": "距离 {event} 的时间", "timeTillDaylight": "距离白天还有 {time}。", @@ -727,13 +729,16 @@ "trackerRemovePlayerDesc": "从 {tracker} 移除玩家", "trademarkShownBeforeMessage": "每条游戏内消息前将显示 {trademark}。", "trainYard": "火车站", - "travelingVendor": "旅行中的商贩", - "travelingVendorDetectedSetting": "当发现旅行商贩时,发送通知。", - "travelingVendorLeftSetting": "当旅行商贩离开地图时,发送通知。", - "travelingVendorLocatedAt": "旅行商贩位于 {location}。", - "travelingVendorLeftMap": "旅行商贩刚刚离开了地图,位置是 {location}。", - "travelingVendorNotCurrentlyOnMap": "旅行商贩目前不在地图上。", - "travelingVendorSpawnedAt": "旅行商贩出现在 {location}。", + "travelingVendor": "流动商人", + "travelingVendorDetectedSetting": "检测到流动商人时,发送通知。", + "travelingVendorHaltedAt": "流动商人停在 {location}。", + "travelingVendorHaltedSetting": "当流动商人停止移动时,发送通知。", + "travelingVendorLeftSetting": "当流动商人离开地图时,发送通知。", + "travelingVendorLocatedAt": "流动商人位于 {location}。", + "travelingVendorLeftMap": "流动商人刚刚在 {location} 离开了地图。", + "travelingVendorNotCurrentlyOnMap": "流动商人当前不在地图上。", + "travelingVendorResumedAt": "流动商人在 {location} 重新开始移动。", + "travelingVendorSpawnedAt": "流动商人出现在 {location}。", "turnOffCap": "关闭", "turnOnCap": "开启", "turningGroupOnOff": "将组 {group} 转换为 {status}。", From 6b8d04a8d7363bb66bb0a3d05025f909e6f3d117 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 16 Nov 2024 08:02:21 +0000 Subject: [PATCH 26/35] add devcontainer --- .devcontainer/devcontainer.json | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..0da240716 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,40 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node +{ + "name": "RustPlusPlus Dev Container", + "image": "mcr.microsoft.com/devcontainers/javascript-node:22", + + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "22" + }, + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": {} + }, + + // Install npm packages and set up the development environment + "postCreateCommand": "npm install", + + // Setup VS Code extensions + "customizations": { + "vscode": { + "extensions": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "ms-azuretools.vscode-docker" + ] + } + }, + + "remoteEnv": { + "RPP_LANGUAGE": "en", + "RPP_POLLING_INTERVAL": "10000", + "RPP_LOG_CALL_STACK": "true", + "RPP_RECONNECT_INTERVAL": "15000", + "RPP_DISCORD_USERNAME": "RustPlusPlus", + "RPP_DISCORD_CLIENT_ID": "", + "RPP_DISCORD_TOKEN": "", + "RPP_NEED_ADMIN_PRIVILEGES": "false" + } +} From 60c67777323e3e95e3900f837dfee48a06132aee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 14:35:45 +0000 Subject: [PATCH 27/35] Bump actions/setup-node from 4.0.4 to 4.1.0 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.0.4 to 4.1.0. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4.0.4...v4.1.0) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index eab0101e9..f2f56d058 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: node: [18, 20, 22 ] steps: - uses: actions/checkout@v4.2.1 - - uses: actions/setup-node@v4.0.4 + - uses: actions/setup-node@v4.1.0 with: node-version: ${{ matrix.node }} cache: 'npm' From f7efc3cd30e7a8c884ec3503762bafd4f0232b95 Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sat, 14 Dec 2024 12:12:55 +0100 Subject: [PATCH 28/35] Add Market Blacklist Command, Add Translations, Add Property to Instance File --- src/commands/market.js | 92 +++++++++++++++++++++++++++++++++- src/languages/en.json | 11 ++++ src/util/CreateInstanceFile.js | 2 + 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/src/commands/market.js b/src/commands/market.js index cbad557c9..5a14a3c8c 100644 --- a/src/commands/market.js +++ b/src/commands/market.js @@ -1,5 +1,6 @@ /* Copyright (C) 2022 Alexander Emanuelsson (alexemanuelol) + Copyright (C) 2022 René Renken (faithix) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -89,7 +90,22 @@ module.exports = { .setRequired(false))) .addSubcommand(subcommand => subcommand .setName('list') - .setDescription(client.intlGet(guildId, 'commandsMarketListDesc'))); + .setDescription(client.intlGet(guildId, 'commandsMarketListDesc'))) + .addSubcommand(subcommand => subcommand + .setName('blacklist') + .setDescription(client.intlGet(guildId, 'commandsMarketBlaclistDesc')) + .addStringOption(option => option + .setName('choice') + .setDescription(client.intlGet(guildId, 'commandsAddOrRemove')) + .setRequired(true) + .addChoices( + { name: client.intlGet(guildId, 'add'), value: 'add' }, + { name: client.intlGet(guildId, 'remove'), value: 'remove' }, + { name: client.intlGet(guildId, 'show'), value: 'show' })) + .addStringOption(option => option + .setName('name') + .setDescription(client.intlGet(guildId, 'theNameOfTheVendingMachine')) + .setRequired(false))); }, async execute(client, interaction) { @@ -406,6 +422,80 @@ module.exports = { client.intlGet(interaction.guildId, 'showingSubscriptionList')); } break; + case 'blacklist': { + const choice = interaction.options.getString('choice'); + const name = interaction.options.getString('name'); + + if (choice === 'add' && name !== null) { + if (instance.marketBlacklist.includes(name)) { + const str = client.intlGet(interaction.guildId, 'alreadyBlacklisted', { + name: name + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + rustplus.log(client.intlGet(interaction.guildId, 'warningCap'), str); + } + else { + instance.marketBlacklist.push(name); + client.setInstance(interaction.guildId, instance); + + const str = client.intlGet(interaction.guildId, 'justBlacklisted', { + name: name + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(0, str)); + rustplus.log(client.intlGet(interaction.guildId, 'infoCap'), str); + } + } + else if (choice === 'remove' && name !== null) { + if (instance.marketBlacklist.includes(name)) { + instance.marketBlacklist = instance.marketBlacklist.filter(e => e !== name); + client.setInstance(interaction.guildId, instance); + + const str = client.intlGet(interaction.guildId, 'removedBlacklist', { + name: name + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(0, str)); + rustplus.log(client.intlGet(interaction.guildId, 'infoCap'), str); + } + else { + const str = client.intlGet(interaction.guildId, 'notExistInBlacklist', { + name: name + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + rustplus.log(client.intlGet(interaction.guildId, 'warningCap'), str); + } + } + else if (choice === 'show') { + let names = ''; + for (const name of instance.marketBlacklist) { + names += `\`${name}\`\n`; + } + + await client.interactionEditReply(interaction, { + embeds: [DiscordEmbeds.getEmbed({ + color: Constants.COLOR_DEFAULT, + title: client.intlGet(interaction.guildId, 'blacklist'), + footer: { text: instance.serverList[rustplus.serverId].title }, + description: names === '' ? '\u200B' : names + })], + ephemeral: true + }); + + rustplus.log(client.intlGet(interaction.guildId, 'infoCap'), + client.intlGet(interaction.guildId, 'showingBlacklist')); + } + else if (choice === null || name === null) { + const str = client.intlGet(interaction.guildId, 'noNameGiven'); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + rustplus.log(client.intlGet(interaction.guildId, 'warningCap'), str); + return; + } + + client.log(client.intlGet(null, 'infoCap'), client.intlGet(null, 'slashCommandValueChange', { + id: `${verifyId}`, + value: `blacklist, ${choice}, ${name}` + })); + } break; + default: { } break; diff --git a/src/languages/en.json b/src/languages/en.json index bb5fb961d..2b1791f2c 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -3,6 +3,7 @@ "abandonedCabins": "Abandoned Cabins", "abandonedMilitaryBase": "Abandoned Military Base", "abandonedSupermarket": "Abandoned Supermarket", + "add": "Add", "addPlayerCap": "ADD PLAYER", "addSwitchCap": "ADD SWITCH", "afkCap": "AFK", @@ -16,6 +17,7 @@ "aliases": "Aliases", "all": "all", "allTeammatesAreDead": "All your teammates are dead.", + "alreadyBlacklisted": "Vending Machine {name} is already blacklisted.", "alreadySubscribedToItem": "Already subscribed to item {name}.", "ampersand": "Ampersand", "andMorePlayers": "... and {number} more players.", @@ -168,6 +170,7 @@ "commandSyntaxUptime": "uptime", "commandSyntaxWipe": "wipe", "commandSyntaxWood": "wood", + "commandsAddOrRemove": "Add or Remove a Vending Machine.", "commandsAlarmDesc": "Operations on Smart Alarms.", "commandsAlarmEditDesc": "Edit the properties of a Smart Alarm.", "commandsAlarmEditIdDesc": "The ID of the Smart Alarm.", @@ -209,6 +212,7 @@ "commandsMapDesc": "Get the currently connected server map image.", "commandsMapMarkersDesc": "Get the map including markers.", "commandsMapMonumentsDesc": "Get the map including monument names.", + "commandsMarketBlaclistDesc": "Add or Remove a Vending Machine Name to the Blacklist.", "commandsMarketDesc": "Operations for In-Game Vending Machines.", "commandsMarketListDesc": "Display the subscription list.", "commandsMarketOrderDesc": "The order type.", @@ -429,6 +433,7 @@ "itemAvailableInVendingMachine": "{items} just became available in a Vending Machine at [{location}].", "itemAvailableNotifyInGameSetting": "When an item from the subscription list becomes available in a Vending Machine, notify In-Game?", "junkyard": "Junkyard", + "justBlacklisted": "Vending Machine {name} just got blacklisted.", "justSubscribedToItem": "Just subscribed to item {name}.", "languageCode": "Language code: {code}", "languageLangNotSupported": "The language {language} is not supported.", @@ -500,6 +505,7 @@ "noItemFound": "Item could not be found in any Vending Machines...", "noItemWithIdFound": "No item with id {id} could be found.", "noItemWithNameFound": "No item with name {name} could be found.", + "noNameGiven": "No 'name' was given.", "noNameIdGiven": "No 'name' or 'id' was given.", "noOneIsAfk": "No one is AFK.", "noOneIsOffline": "No one is offline.", @@ -519,6 +525,7 @@ "notAValidOrderType": "{order} is not a valid order type.", "notActive": "Not active.", "notConnectedToRustServer": "Not currently connected to a rust server.", + "notExistInBlacklist": "Vending Machine {name} does not exist in blacklist.", "notExistInSubscription": "Item {name} does not exist in subscription list.", "notFoundCap": "NOT FOUND", "notPartOfRole": "You are not part of the {role} role, therefore you can't run bot commands.", @@ -585,6 +592,8 @@ "recycleCap": "RECYCLE", "recycler": "Recycler", "remain": "left", + "remove": "Remove", + "removedBlacklist": "Vending Machine {name} got removed from the blacklist.", "removePlayerCap": "REMOVE PLAYER", "removeSwitchCap": "REMOVE SWITCH", "removedSubscribeItem": "Item {name} have been removed from subscription.", @@ -635,6 +644,7 @@ "shouldSmartAlarmNotifyNotConnectedSetting": "Should Smart Alarms notify even if they are not setup on the connected rust server?", "shouldSmartAlarmsNotifyInGameSetting": "Should Smart Alarms notify In-Game?", "shouldSmartSwitchNotifyInGameWhenChangedFromDiscord": "Should Smart Switches and Smart Switch Groups notify In-Game when they are changed from discord?", + "show": "Show", "showingBlacklist": "Showing the blacklist.", "showingSubscriptionList": "Showing the subscription list.", "shredder": "Shredder", @@ -690,6 +700,7 @@ "theIdOfTheItem": "The id of the item.", "theNameOfTheItem": "The name of the item.", "theNameOfThePlayer": "The name of the player.", + "theNameOfTheVendingMachine": "The name of the vending machine.", "three": "Three", "tilde": "Tilde", "time": "Time", diff --git a/src/util/CreateInstanceFile.js b/src/util/CreateInstanceFile.js index 3ad0f1dcc..2f7d071a4 100644 --- a/src/util/CreateInstanceFile.js +++ b/src/util/CreateInstanceFile.js @@ -62,6 +62,7 @@ module.exports = (client, guild) => { buy: [], sell: [] }, + marketBlacklist: [], teamChatColors: {}, blacklist: { discordIds: [], @@ -174,6 +175,7 @@ module.exports = (client, guild) => { buy: [], sell: [] } + if (!instance.hasOwnProperty('marketBlacklist')) instance.marketBlacklist = []; if (!instance.marketSubscriptionList.hasOwnProperty('all')) instance.marketSubscriptionList['all'] = []; if (!instance.marketSubscriptionList.hasOwnProperty('buy')) instance.marketSubscriptionList['buy'] = []; if (!instance.marketSubscriptionList.hasOwnProperty('sell')) instance.marketSubscriptionList['sell'] = []; From 582b8841d5fbb4c5e0e2cd14a0bf9e6454c5532f Mon Sep 17 00:00:00 2001 From: FaiThiX Date: Sun, 15 Dec 2024 13:34:08 +0100 Subject: [PATCH 29/35] add Blacklist Checking to the MapMarkers --- src/structures/MapMarkers.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/structures/MapMarkers.js b/src/structures/MapMarkers.js index 6709e24ba..c8c25f3dc 100644 --- a/src/structures/MapMarkers.js +++ b/src/structures/MapMarkers.js @@ -251,8 +251,17 @@ class MapMarkers { return remainingMarkersOfType; } - - + isVendingMachineBlacklisted(marker) { + if (marker.type !== this.types.VendingMachine) return false; + + const instance = this.client.getInstance(this.rustplus.guildId); + const marketBlacklist = instance.marketBlacklist; + + return marketBlacklist.some(blacklist => + marker.name.toLowerCase().includes(blacklist.toLowerCase()) + ); + } + /* Update event map markers */ @@ -310,7 +319,7 @@ class MapMarkers { marker.location = pos; - if (!this.rustplus.isFirstPoll) { + if (!this.rustplus.isFirstPoll && !this.isVendingMachineBlacklisted(marker)) { if (!this.knownVendingMachines.some(e => e.x === marker.x && e.y === marker.y)) { this.rustplus.sendEvent( this.rustplus.notificationSettings.vendingMachineDetectedSetting, From 6ce1c09f3c4eae14ead1af35ac8e467c6fbe256e Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Thu, 26 Dec 2024 21:29:37 -0500 Subject: [PATCH 30/35] Add 'raid' command Adds a first iteration of the 'raid' command which will display the raid costs of an associated item --- docs/commands.md | 12 ++ docs/images/slash_commands/raid.png | Bin 0 -> 16924 bytes src/commands/durability.js | 180 ++++++++++++++++++++++++++++ src/discordTools/discordEmbeds.js | 30 +++++ src/discordTools/discordMessages.js | 9 ++ src/external/process_rustlabs.js | 5 +- src/languages/en.json | 3 + src/structures/RustLabs.js | 2 +- 8 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 docs/images/slash_commands/raid.png create mode 100644 src/commands/durability.js diff --git a/docs/commands.md b/docs/commands.md index 9dfd6ab22..a24806097 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -22,6 +22,7 @@ Slash Command | Description [**/map**](commands.md#map) | Get the currently connected server map image. [**/market**](commands.md#market) | Operations for In-Game Vending Machines. [**/players**](commands.md#players) | Get player/players information based on battlemetrics. +[**/raid**](commands.md#raid) | Display the raid costs for an item. [**/recycle**](commands.md#recycle) | Display the output of recycling an item. [**/research**](commands.md#research) | Display the cost to research an item. [**/reset**](commands.md#reset) | Reset Discord channels. @@ -224,6 +225,17 @@ Subcommand | Options | Description | Required ![Discord Slash Command players specific user Image](images/slash_commands/players_specific_user.png) +## **/raid** + +> **Display the raid costs for an item.** + +Subcommand | Options | Description | Required +---------- | ------- | ----------- | -------- +  | `name` | The name of the item to raid. | `False` +  | `id` | The id of the item to raid. | `False` + +![Discord Slash Command raid Image](images/slash_commands/raid.png) + ## **/recycle** > **Display the output of recycling an item.** diff --git a/docs/images/slash_commands/raid.png b/docs/images/slash_commands/raid.png new file mode 100644 index 0000000000000000000000000000000000000000..6295ea1bc59319c3df41147841bf821e79a352c3 GIT binary patch literal 16924 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 literal 0 HcmV?d00001 diff --git a/src/commands/durability.js b/src/commands/durability.js new file mode 100644 index 000000000..a35310328 --- /dev/null +++ b/src/commands/durability.js @@ -0,0 +1,180 @@ +/* + Copyright (C) 2023 Alexander Emanuelsson (alexemanuelol) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + https://github.com/alexemanuelol/rustplusplus + +*/ + +const Builder = require('@discordjs/builders'); + +const DiscordEmbeds = require('../discordTools/discordEmbeds.js'); +const DiscordMessages = require('../discordTools/discordMessages.js'); + +module.exports = { + name: 'raid', + + getData(client, guildId) { + return new Builder.SlashCommandBuilder() + .setName('raid') + .setDescription(client.intlGet(guildId, 'commandsRaidDesc')) + .addStringOption(option => option + .setName('name') + .setDescription(client.intlGet(guildId, 'theNameOfTheItem')) + .setRequired(false)) + .addStringOption(option => option + .setName('id') + .setDescription(client.intlGet(guildId, 'theIdOfTheItem')) + .setRequired(false)); + }, + + + + /** + * Group durability data by group and toolId. + * @param {array} data The array of durability data objects. + * @return {object} The grouped durability data. + */ + groupDurabilityData(client, data) { + const groupedData = {}; + + for (const item of data) { + if (item.which === 'soft') continue; + + if (!groupedData[item.group]) { + groupedData[item.group] = {}; + } + + if (!groupedData[item.group][item.toolId]) { + groupedData[item.group][item.toolId] = []; + } + + groupedData[item.group][item.toolId].push({ + ...item, + 'itemName': client.items.getName(item.toolId) + }); + } + + return groupedData; + }, + + async execute(client, interaction) { + const guildId = interaction.guildId; + + const verifyId = Math.floor(100000 + Math.random() * 900000); + client.logInteraction(interaction, verifyId, 'slashCommand'); + + if (!await client.validatePermissions(interaction)) return; + await interaction.deferReply({ ephemeral: true }); + + const raidItemName = interaction.options.getString('name'); + const raidItemId = interaction.options.getString('id'); + const raidWithName = interaction.options.getString('raidwithname'); + + if (raidWithName !== null) { + let raidWithItem = null + if (!raidWithItem) { + raidWithItem = client.rustlabs.getClosestOtherNameByName(raidItemName); + } + + if (!raidWithItem) { + raidWithItem = client.rustlabs.getClosestBuildingBlockNameByName(raidItemName); + } + + if (!raidWithItem) { + raidWithItem = client.items.getClosestItemIdByName(raidItemName); + } + + if (raidWithItem === null) { + const str = client.intlGet(guildId, 'noItemWithNameFound', { + name: raidItemName + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + client.log(client.intlGet(guildId, 'warningCap'), str); + return; + } + } + + let itemId = null; + if (raidItemName !== null) { + let item = null + if (!item) { + item = client.rustlabs.getClosestOtherNameByName(raidItemName); + } + + if (!item) { + item = client.rustlabs.getClosestBuildingBlockNameByName(raidItemName); + } + + if (!item) { + item = client.items.getClosestItemIdByName(raidItemName); + if(item !== null) { + item = client.items.getName(item); + } + } + + if (item === null) { + const str = client.intlGet(guildId, 'noItemWithNameFound', { + name: raidItemName + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + client.log(client.intlGet(guildId, 'warningCap'), str); + return; + } + else { + itemId = item; + } + } + else if (raidItemId !== null) { + if (client.items.itemExist(raidItemId)) { + itemId = raidItemId; + } + else { + const str = client.intlGet(guildId, 'noItemWithIdFound', { + id: raidItemId + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + client.log(client.intlGet(guildId, 'warningCap'), str); + return; + } + } + else if (raidItemName === null && raidItemId === null) { + const str = client.intlGet(guildId, 'noNameIdGiven'); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + client.log(client.intlGet(guildId, 'warningCap'), str); + return; + } + const itemName = client.items.getName(itemId); + + const raidDetails = client.rustlabs.getDurabilityDetailsByName(raidItemName); + if (raidDetails === null) { + const str = client.intlGet(guildId, 'couldNotFindRaidDetails', { + name: itemName + }); + await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); + client.log(client.intlGet(guildId, 'warningCap'), str); + return; + } + + client.log(client.intlGet(null, 'infoCap'), client.intlGet(null, 'slashCommandValueChange', { + id: `${verifyId}`, + value: `${raidItemName} ${raidItemId}` + })); + + raidDetails[3] = this.groupDurabilityData(client, raidDetails[3]); + await DiscordMessages.sendRaidMessage(interaction, raidDetails); + client.log(client.intlGet(null, 'infoCap'), client.intlGet(guildId, 'commandsRaidDesc')); + }, +}; diff --git a/src/discordTools/discordEmbeds.js b/src/discordTools/discordEmbeds.js index c47e46359..cf989e60c 100644 --- a/src/discordTools/discordEmbeds.js +++ b/src/discordTools/discordEmbeds.js @@ -1121,6 +1121,36 @@ module.exports = { }); }, + getRaidEmbed: function (guildId, raidDetails) { + const raidCosts = { + name: '', + time: '', + sulfur: '' + }; + + const sortedItems = Object.values(raidDetails[3].explosive).sort((a, b) => { + const sulfurA = a[0].sulfur === null ? Infinity : Number(a[0].sulfur); + const sulfurB = b[0].sulfur === null ? Infinity : Number(b[0].sulfur); + return sulfurA - sulfurB; + }); + for (const item of sortedItems) { + raidCosts.name += `${item[0].itemName}\n`; + raidCosts.time += `${item[0].timeString} (${item[0].quantity})\n`; + raidCosts.sulfur += `${item[0].sulfur}\n`; + } + + return module.exports.getEmbed({ + title: `${raidDetails[1]}`, + color: Constants.COLOR_DEFAULT, + timestamp: true, + fields: [ + { name: Client.client.intlGet(guildId, 'name'), value: raidCosts.name.trim(), inline: true }, + { name: Client.client.intlGet(guildId, 'time'), value: raidCosts.time.trim(), inline: true }, + { name: Client.client.intlGet(guildId, 'sulfur'), value: raidCosts.sulfur.trim(), inline: true } + ] + }); + }, + getResearchEmbed: function (guildId, researchDetails) { let typeString = '', scrapString = ''; if (researchDetails[2].researchTable !== null) { diff --git a/src/discordTools/discordMessages.js b/src/discordTools/discordMessages.js index dcc2e0ee5..dbace5ab1 100644 --- a/src/discordTools/discordMessages.js +++ b/src/discordTools/discordMessages.js @@ -560,6 +560,15 @@ module.exports = { await Client.client.interactionEditReply(interaction, content); }, + sendRaidMessage: async function (interaction, raidDetails) { + const content = { + embeds: [DiscordEmbeds.getRaidEmbed(interaction.guildId, raidDetails)], + ephemeral: true + } + + await Client.client.interactionEditReply(interaction, content); + }, + sendResearchMessage: async function (interaction, researchDetails) { const content = { embeds: [DiscordEmbeds.getResearchEmbed(interaction.guildId, researchDetails)], diff --git a/src/external/process_rustlabs.js b/src/external/process_rustlabs.js index c12a68b40..e7b5f7a86 100644 --- a/src/external/process_rustlabs.js +++ b/src/external/process_rustlabs.js @@ -594,7 +594,10 @@ function processItemDurability(rustlabsName, shortname, name, data, type = 'item } if (toolShortname === null || toolName === null) exit(); toolId = Object.keys(ITEMS).find(e => ITEMS[e].shortname === toolShortname && ITEMS[e].name === toolName); - if (!toolId) exit(); + if (!toolId) { + console.error(`Tool ID not found for ${toolShortname} - ${toolName}`); + continue; // Skip this iteration and continue with the next match + } /* Caption in tool name */ let captionInTool = null; diff --git a/src/languages/en.json b/src/languages/en.json index 2b1791f2c..6229550b3 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -229,6 +229,7 @@ "commandsRecycleQuantityDesc": "The quantity of items to recycle.", "commandsRecycleRecyclerTypeDesc": "The recycler type (recycler, shredder, safe-zone-recycler).", "commandsResearchDesc": "Display the cost to research an item.", + "commandsRaidDesc": "Display the cost to destroy an item.", "commandsResetAlarmsDesc": "Reset alarms channel.", "commandsResetDesc": "Reset Discord channels.", "commandsResetInformationDesc": "Reset information channel.", @@ -301,6 +302,7 @@ "couldNotFindPlayerId": "Could not find player with id {id}.", "couldNotFindRecycleDetails": "Could not find recycle details for {name}.", "couldNotFindResearchDetails": "Could not find research details for {name}.", + "couldNotFindRaidDetails": "Could not find raid details for {name}.", "couldNotFindRole": "Could not find role: {roleId}", "couldNotFindStackDetails": "Could not find stack details for {name}.", "couldNotFindTeammate": "Could not find teammate: {name}.", @@ -692,6 +694,7 @@ "subscribeToChangesBattlemetrics": "Subscribe to different changes on Battlemetrics.", "subscriptionList": "Subscription list", "subscriptionListEmpty": "Item subscription list is empty.", + "sulfur": "Sulfur", "sulfurQuarry": "Sulfur Quarry", "switches": "Switches", "teamMember": "Team Member", diff --git a/src/structures/RustLabs.js b/src/structures/RustLabs.js index cf2a2bb6d..69f4fc434 100644 --- a/src/structures/RustLabs.js +++ b/src/structures/RustLabs.js @@ -529,7 +529,7 @@ class RustLabs { content = this.getArrayOrderedByChoice(content, orderedBy); - return ['items', id, this.items.items[id], content]; + return ['items', this.items.items[id].name, this.items.items[id], content]; } From f0a9c8e9b6d7b0146f174108506c08abdd5a5642 Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Thu, 26 Dec 2024 23:38:07 -0500 Subject: [PATCH 31/35] Add rudimentary in-game raid command --- src/commands/durability.js | 97 ++++++++++----------------- src/handlers/discordCommandHandler.js | 4 ++ src/handlers/inGameCommandHandler.js | 4 ++ src/languages/en.json | 1 + src/structures/RustPlus.js | 27 ++++++++ 5 files changed, 72 insertions(+), 61 deletions(-) diff --git a/src/commands/durability.js b/src/commands/durability.js index a35310328..4552eb178 100644 --- a/src/commands/durability.js +++ b/src/commands/durability.js @@ -70,43 +70,7 @@ module.exports = { return groupedData; }, - async execute(client, interaction) { - const guildId = interaction.guildId; - - const verifyId = Math.floor(100000 + Math.random() * 900000); - client.logInteraction(interaction, verifyId, 'slashCommand'); - - if (!await client.validatePermissions(interaction)) return; - await interaction.deferReply({ ephemeral: true }); - - const raidItemName = interaction.options.getString('name'); - const raidItemId = interaction.options.getString('id'); - const raidWithName = interaction.options.getString('raidwithname'); - - if (raidWithName !== null) { - let raidWithItem = null - if (!raidWithItem) { - raidWithItem = client.rustlabs.getClosestOtherNameByName(raidItemName); - } - - if (!raidWithItem) { - raidWithItem = client.rustlabs.getClosestBuildingBlockNameByName(raidItemName); - } - - if (!raidWithItem) { - raidWithItem = client.items.getClosestItemIdByName(raidItemName); - } - - if (raidWithItem === null) { - const str = client.intlGet(guildId, 'noItemWithNameFound', { - name: raidItemName - }); - await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); - client.log(client.intlGet(guildId, 'warningCap'), str); - return; - } - } - + getDurabilityData(raidItemName, raidItemId, client, guildId) { let itemId = null; if (raidItemName !== null) { let item = null @@ -126,12 +90,7 @@ module.exports = { } if (item === null) { - const str = client.intlGet(guildId, 'noItemWithNameFound', { - name: raidItemName - }); - await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); - client.log(client.intlGet(guildId, 'warningCap'), str); - return; + return null; } else { itemId = item; @@ -142,38 +101,54 @@ module.exports = { itemId = raidItemId; } else { - const str = client.intlGet(guildId, 'noItemWithIdFound', { - id: raidItemId - }); - await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); - client.log(client.intlGet(guildId, 'warningCap'), str); - return; + return null; } } - else if (raidItemName === null && raidItemId === null) { + const itemName = client.items.getName(itemId); + + const raidDetails = client.rustlabs.getDurabilityDetailsByName(raidItemName); + if (raidDetails === null) { + return null; + } + + raidDetails[3] = this.groupDurabilityData(client, raidDetails[3]); + return raidDetails; + }, + + async execute(client, interaction) { + const guildId = interaction.guildId; + + const verifyId = Math.floor(100000 + Math.random() * 900000); + client.logInteraction(interaction, verifyId, 'slashCommand'); + + if (!await client.validatePermissions(interaction)) return; + await interaction.deferReply({ ephemeral: true }); + + const raidItemName = interaction.options.getString('name'); + const raidItemId = interaction.options.getString('id'); + if (raidItemName === null && raidItemId === null) { const str = client.intlGet(guildId, 'noNameIdGiven'); await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); client.log(client.intlGet(guildId, 'warningCap'), str); - return; + return null; } - const itemName = client.items.getName(itemId); + + client.log(client.intlGet(null, 'infoCap'), client.intlGet(null, 'slashCommandValueChange', { + id: `${verifyId}`, + value: `${raidItemName} ${raidItemId}` + })); + + const raidDetails = this.getDurabilityData(raidItemName, raidItemId, client, interaction); - const raidDetails = client.rustlabs.getDurabilityDetailsByName(raidItemName); if (raidDetails === null) { - const str = client.intlGet(guildId, 'couldNotFindRaidDetails', { - name: itemName + const str = client.intlGet(guildId, 'noItemWithNameFound', { + name: raidItemName }); await client.interactionEditReply(interaction, DiscordEmbeds.getActionInfoEmbed(1, str)); client.log(client.intlGet(guildId, 'warningCap'), str); return; } - client.log(client.intlGet(null, 'infoCap'), client.intlGet(null, 'slashCommandValueChange', { - id: `${verifyId}`, - value: `${raidItemName} ${raidItemId}` - })); - - raidDetails[3] = this.groupDurabilityData(client, raidDetails[3]); await DiscordMessages.sendRaidMessage(interaction, raidDetails); client.log(client.intlGet(null, 'infoCap'), client.intlGet(guildId, 'commandsRaidDesc')); }, diff --git a/src/handlers/discordCommandHandler.js b/src/handlers/discordCommandHandler.js index baf9f6bc4..89f4053cb 100644 --- a/src/handlers/discordCommandHandler.js +++ b/src/handlers/discordCommandHandler.js @@ -204,6 +204,10 @@ module.exports = { commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxTravelingVendor')}`) { response = rustplus.getCommandTravelingVendor(); } + else if (commandLowerCase === `${prefix}${client.intlGet('en', 'commandSyntaxRaid')}` || + commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxRaid')}`) { + response = rustplus.getCommandRaidCost(command); + } else { /* Smart Switches/ Group Switches are not currently supported through discord. */ return false; diff --git a/src/handlers/inGameCommandHandler.js b/src/handlers/inGameCommandHandler.js index 8d606ef74..6ea2d1699 100644 --- a/src/handlers/inGameCommandHandler.js +++ b/src/handlers/inGameCommandHandler.js @@ -211,6 +211,10 @@ module.exports = { commandLowerCase === `${prefix}${client.intlGet(guildId, 'commandSyntaxTravelingVendor')}`) { rustplus.sendInGameMessage(rustplus.getCommandTravelingVendor()); } + else if (commandLowerCase.startsWith(`${prefix}${client.intlGet('en', 'commandSyntaxRaid')}`) || + commandLowerCase.startsWith(`${prefix}${client.intlGet(guildId, 'commandSyntaxRaid')}`)) { + rustplus.sendInGameMessage(rustplus.getCommandRaidCost(command)); + } else { /* Maybe a custom command? */ diff --git a/src/languages/en.json b/src/languages/en.json index 6229550b3..7399eab14 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -144,6 +144,7 @@ "commandSyntaxPlayers": "players", "commandSyntaxPop": "pop", "commandSyntaxProx": "prox", + "commandSyntaxRaid": "raid", "commandSyntaxRecycle": "recycle", "commandSyntaxRemove": "remove", "commandSyntaxResearch": "research", diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js index 39820fa6a..1d2074c54 100644 --- a/src/structures/RustPlus.js +++ b/src/structures/RustPlus.js @@ -38,6 +38,7 @@ const Map = require('../util/map.js'); const RustPlusLite = require('../structures/RustPlusLite'); const TeamHandler = require('../handlers/teamHandler.js'); const Timer = require('../util/timer.js'); +const Durability = require('../commands/durability.js'); const TOKENS_LIMIT = 24; /* Per player */ const TOKENS_REPLENISH = 3; /* Per second */ @@ -2746,6 +2747,32 @@ class RustPlus extends RustPlusLib { return strings; } + + getCommandRaidCost(command) { + const prefix = this.generalSettings.prefix; + const commandRaid = `${prefix}${Client.client.intlGet(this.guildId, 'commandSyntaxRaid')}`; + const commandRaidEn = `${prefix}${Client.client.intlGet('en', 'commandSyntaxRaid')}`; + if (command.toLowerCase().startsWith(`${commandRaid} `)) { + command = command.slice(`${commandRaid} `.length).trim(); + } + else { + command = command.slice(`${commandRaidEn} `.length).trim(); + } + + const durability = Durability.getDurabilityData(command, null, Client.client, this.guildId); + let raidCosts = ""; + + const sortedItems = Object.values(durability[3].explosive).sort((a, b) => { + const sulfurA = a[0].sulfur === null ? Infinity : Number(a[0].sulfur); + const sulfurB = b[0].sulfur === null ? Infinity : Number(b[0].sulfur); + return sulfurA - sulfurB; + }).slice(0,3); + for (const item of sortedItems) { + raidCosts += `${item[0].itemName} ${item[0].timeString} (${item[0].quantity}) ${item[0].sulfur}, `; + } + + return raidCosts; + } } module.exports = RustPlus; From 1814c613125bd7fd12215de7802e9b8aa48f9c7c Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Fri, 27 Dec 2024 09:33:09 -0500 Subject: [PATCH 32/35] Provide error message when an item or building block is not found --- src/structures/RustPlus.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js index 1d2074c54..e86c85033 100644 --- a/src/structures/RustPlus.js +++ b/src/structures/RustPlus.js @@ -2761,6 +2761,12 @@ class RustPlus extends RustPlusLib { const durability = Durability.getDurabilityData(command, null, Client.client, this.guildId); let raidCosts = ""; + + if(!durability) { + return Client.client.intlGet(this.guildId, 'noItemWithNameFound', { + name: command + }); + } const sortedItems = Object.values(durability[3].explosive).sort((a, b) => { const sulfurA = a[0].sulfur === null ? Infinity : Number(a[0].sulfur); From 867bcb80b3c100cc93f87e4e529edcfe0faa80a7 Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Fri, 27 Dec 2024 09:56:58 -0500 Subject: [PATCH 33/35] Fix for team chat duplicate message and add building block to the command response Fix issue where the command response was being sent to team chat in discord due to trailing whitespace, add building block name to the command response --- src/structures/RustPlus.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js index e86c85033..0461d9fe4 100644 --- a/src/structures/RustPlus.js +++ b/src/structures/RustPlus.js @@ -2760,7 +2760,7 @@ class RustPlus extends RustPlusLib { } const durability = Durability.getDurabilityData(command, null, Client.client, this.guildId); - let raidCosts = ""; + let raidCosts = `${durability[1]}: `; if(!durability) { return Client.client.intlGet(this.guildId, 'noItemWithNameFound', { @@ -2777,7 +2777,7 @@ class RustPlus extends RustPlusLib { raidCosts += `${item[0].itemName} ${item[0].timeString} (${item[0].quantity}) ${item[0].sulfur}, `; } - return raidCosts; + return raidCosts.trim().trim(","); } } From 3d4b7a71fdb2a3c7136ee37a1d2e3c1f8e6b26fb Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Fri, 27 Dec 2024 12:24:51 -0500 Subject: [PATCH 34/35] Search items before building blocks When returning the durability information, search building blocks last so we do not return "Armored Floor" when searching for "Armored Door" --- src/commands/durability.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/durability.js b/src/commands/durability.js index 4552eb178..d6510bdde 100644 --- a/src/commands/durability.js +++ b/src/commands/durability.js @@ -77,17 +77,17 @@ module.exports = { if (!item) { item = client.rustlabs.getClosestOtherNameByName(raidItemName); } - - if (!item) { - item = client.rustlabs.getClosestBuildingBlockNameByName(raidItemName); - } - + if (!item) { item = client.items.getClosestItemIdByName(raidItemName); if(item !== null) { item = client.items.getName(item); } } + + if (!item) { + item = client.rustlabs.getClosestBuildingBlockNameByName(raidItemName); + } if (item === null) { return null; From 14eb1189cd5348b466bb273164e9b5ad4a1b1f1b Mon Sep 17 00:00:00 2001 From: Chris Jensen Date: Fri, 27 Dec 2024 13:36:45 -0500 Subject: [PATCH 35/35] Search items before building blocks Resolve bug where Armored Floor was being returned instead of Armored Door --- src/structures/RustLabs.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/structures/RustLabs.js b/src/structures/RustLabs.js index 69f4fc434..7db9ce46f 100644 --- a/src/structures/RustLabs.js +++ b/src/structures/RustLabs.js @@ -469,10 +469,10 @@ class RustLabs { } if (!foundName) { - foundName = this.getClosestBuildingBlockNameByName(name); + foundName = this.items.getClosestItemIdByName(name); if (foundName) { - if (this.durabilityData['buildingBlocks'].hasOwnProperty(foundName)) { - type = 'buildingBlocks'; + if (this.durabilityData['items'].hasOwnProperty(foundName)) { + return this.getDurabilityDetailsById(foundName, group, which, orderedBy); } else { foundName = null; @@ -481,10 +481,10 @@ class RustLabs { } if (!foundName) { - foundName = this.items.getClosestItemIdByName(name); + foundName = this.getClosestBuildingBlockNameByName(name); if (foundName) { - if (this.durabilityData['items'].hasOwnProperty(foundName)) { - return this.getDurabilityDetailsById(foundName, group, which, orderedBy); + if (this.durabilityData['buildingBlocks'].hasOwnProperty(foundName)) { + type = 'buildingBlocks'; } else { foundName = null;