-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Plugins development el GR
Το ASF περιλαμβάνει υποστήριξη για προσαρμοσμένα πρόσθετα που μπορούν να φορτωθούν κατά τη διάρκεια του χρόνου εκτέλεσης. Τα πρόσθετα σας επιτρέπουν να προσαρμόσετε τη συμπεριφορά του ASF, για παράδειγμα προσθέτοντας προσαρμοσμένες εντολές, προσαρμοσμένη λογική συναλλαγών ή πλήρη ενσωμάτωση με υπηρεσίες και API τρίτων μερών.
Αυτή η σελίδα περιγράφει τα πρόσθετα ASF από την προοπτική των προγραμματιστών - τη δημιουργία, τη συντήρηση, τη δημοσίευση και το ίδιο. Αν θέλετε να δείτε την προοπτική του χρήστη, μετακινήστε το here αντ' αυτού.
Τα πρόσθετα είναι τυπικές βιβλιοθήκες .NET που ορίζουν μια κλάση κληρονομώντας από την κοινή διασύνδεση IPlugin
που δηλώνεται στο ASF. Μπορείτε να αναπτύξετε τα plugins εντελώς ανεξάρτητα από το mainline ASF και να τα επαναχρησιμοποιήσετε στις τρέχουσες και μελλοντικές εκδόσεις ASF, όσο το εσωτερικό ASF API παραμένει συμβατό. Το σύστημα πρόσθετου που χρησιμοποιείται στο ASF βασίζεται στο System. omposition
, πρώην γνωστό ως Managed Extensibility Framework που επιτρέπει στο ASF να ανακαλύψει και να φορτώσει τις βιβλιοθήκες σας κατά τη διάρκεια του χρόνου εκτέλεσης.
Έχουμε ετοιμάσει ASF-PluginTemplate για εσάς, την οποία μπορείτε (και πρέπει) να χρησιμοποιήσετε ως βάση για το έργο plugin σας. Η χρήση του προτύπου δεν είναι απαίτηση (όπως μπορείτε να κάνετε τα πάντα από το μηδέν), but we heavily recommend to pick it up as it can drastically kickstart your development and cut on time required to get all things right. Απλά δείτε το README του προτύπου και θα σας καθοδηγήσει περαιτέρω. Ανεξάρτητα, θα καλύψουμε τα βασικά παρακάτω σε περίπτωση που θέλατε να ξεκινήσετε από το μηδέν, ή να κατανοήσουν καλύτερα τις έννοιες που χρησιμοποιούνται στο πρότυπο plugin - δεν χρειάζεται συνήθως να κάνετε κάποιο από αυτά, αν έχετε αποφασίσει να χρησιμοποιήσετε το πρότυπο plugin μας.
Το έργο σας θα πρέπει να είναι ένα πρότυπο . Βιβλιοθήκη ET που στοχεύει στο κατάλληλο πλαίσιο της στοχευμένης έκδοσής σας ASF, όπως ορίζεται στην ενότητα **compilation **
Το έργο πρέπει να αναφέρεται στην κύρια συνέλευση «ArchiSteamFarm», είτε στο προκατασκευασμένο «ArchiSteamFarm». llβιβλιοθήκη που έχετε κατεβάσει ως μέρος της έκδοσης, ή το αρχικό έργο (π.χ. αν αποφασίσετε να προσθέσετε το δέντρο ASF ως υπομονάδα). Αυτό θα σας επιτρέψει να έχετε πρόσβαση και να ανακαλύψετε δομές ASF, μεθόδους και ιδιότητες, ειδικά το βασικό περιβάλλον
IPluginτο οποίο θα πρέπει να κληρονομήσετε από το επόμενο βήμα. Το έργο πρέπει επίσης να αναφέρεται στο
System.Composition.AttributedModelστο ελάχιστο, το οποίο σας επιτρέπει να
[Export]σας
IPlugin` για να χρησιμοποιήσετε το ASF. Επιπλέον αυτού, ενδέχεται να θέλετε/χρειάζεται να αναφέρετε άλλες κοινές βιβλιοθήκες προκειμένου να ερμηνεύσετε τις δομές δεδομένων που σας δίνονται σε ορισμένες διεπαφές, αλλά αν δεν τα χρειάζεστε ρητά, αυτό θα είναι αρκετό για τώρα.
Αν τα κάνατε όλα σωστά, το csproj
σας θα είναι παρόμοιο με το παρακάτω:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.</TargetFramework>
</PropertyGroup>
<ItemGroup>
<! - Από τη στιγμή που φορτώνετε plugin στη διαδικασία ASF, η οποία περιλαμβάνει ήδη αυτή την εξάρτηση, ΣυμπεριλήψειςAssets="compile" σας επιτρέπει να το παραλείψετε από την τελική έξοδο -->
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="C:\\Path\To\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />
<! - Εάν χτίσετε με κατεβασμένο δυαδικό αρχείο DLL, χρησιμοποιήστε το αντί του <ProjectReference> πάνω από το -->
<! - <Reference Include="ArchiSteamFarm" HintPath="C:\\Path\To\Downloaded\ArchiSteamFarm.dll" /> -->
</ItemGroup>
</Project>
Από την πλευρά του κώδικα, η κλάση των προσθέτων σας πρέπει να κληρονομήσει από τη διασύνδεση IPlugin
(είτε ρητά, είτε σιωπηρά με την κληρονομώντας από πιο εξειδικευμένη διασύνδεση, όπως το IASF
) και το [Εξαγωγή(typeof(IPlugin)]
προκειμένου να αναγνωρίζονται από το ASF κατά τη διάρκεια εκτέλεσης. Το πιο γυμνό παράδειγμα που επιτυγχάνει αυτό θα ήταν το ακόλουθο:
χρησιμοποιώντας το Σύστημα;
χρησιμοποιώντας το System.Composition;
χρησιμοποιώντας το System.Threading.Tasks;
χρησιμοποιώντας το ArchiSteamFarm;
χρησιμοποιώντας το ArchiSteamFarm.Plugins;
namespace YourNamespace. ourPluginName;
[Εξαγωγή(typeof(IPlugin))]
δημόσια σφραγισμένη κλάση YourPluginName : IPlugin ņ
"δημόσιο string Όνομα => nameof(YourPluginName);
"public Version => typeof(YourPluginName). ssembly.GetName().Version;
"Η Δημόσια Εργασία OnLoaded() {
"ASF.ArchiLogger.LogGenericInfo("Γεια Σου Κόσμος!");
"Επιστρέφει Task.CompletedTask;
"}
}
Για να χρησιμοποιήσετε το plugin σας, πρέπει πρώτα να το μεταγλωττίσετε. Μπορείτε να το κάνετε αυτό είτε από το IDE, είτε από το ριζικό κατάλογο του έργου σας μέσω μιας εντολής:
# Αν το έργο σας είναι αυτόνομο (δεν χρειάζεται να ορίσετε το όνομά του αφού είναι το μοναδικό)
dotnet publish -c "Release" -o "out"
# Αν το έργο σας είναι μέρος του δέντρου πηγαίου κώδικα ASF (για να αποφύγετε τη μεταγλώττιση περιττών τμημάτων)
dotnet publish YourPluginName -c "Release" -o "out"
Στη συνέχεια, το plugin σας είναι έτοιμο για ανάπτυξη. Εξαρτάται από εσάς πώς ακριβώς θέλετε να διανείμετε και να δημοσιεύσετε το plugin σας, αλλά σας συνιστούμε να δημιουργήσετε ένα αρχείο zip όπου θα τοποθετήσετε το μεταγλωττισμένο πρόσθετο μαζί με το dependencies. Με αυτόν τον τρόπο ο χρήστης θα πρέπει απλά να αποσυμπιέσει το συμπιεσμένο αρχείο zip σε έναν αυτόνομο υποκατάλογο μέσα στον κατάλογο plugins
του και να μην κάνει τίποτα άλλο.
Αυτό είναι μόνο το πιο βασικό σενάριο για να ξεκινήσετε. Έχουμε ExamplePlugin
έργο που σας δείχνει παραδείγματα διεπαφών και ενεργειών που μπορείτε να κάνετε μέσα στο δικό σας plugin, συμπεριλαμβανομένων χρήσιμων σχολίων. Μη διστάσετε να ρίξετε μια ματιά αν θέλετε να μάθετε από έναν κώδικα εργασίας ή να ανακαλύψετε ArchiSteamFarm. lugins
namespace τον εαυτό σας και ανατρέξτε στην τεκμηρίωση που περιλαμβάνεται για όλες τις διαθέσιμες επιλογές. Θα αναπτύξουμε επίσης περαιτέρω ορισμένες βασικές έννοιες παρακάτω για να τις εξηγήσουμε καλύτερα.
Αν αντί για παράδειγμα plugin που θέλετε να μάθετε από πραγματικά έργα, υπάρχουν πολλά επίσημα plugins που αναπτύχθηκαν από εμάς, π.χ. ItemsMatcher
, MobileAuthenticator
ή SteamTokenDumper
. Εκτός από αυτό, υπάρχουν επίσης πρόσθετα που αναπτύχθηκαν από άλλους προγραμματιστές, στην ενότητα third-party μας.
ASF, εκτός από αυτό στο οποίο έχετε πρόσβαση στις ίδιες τις διεπαφές, εκθέτει σε σας ένα μεγάλο μέρος των εσωτερικών APIs που μπορείτε να κάνετε χρήση της, προκειμένου να επεκτείνει τη λειτουργικότητα. Για παράδειγμα, αν θέλετε να στείλετε κάποιο νέο αίτημα στο Steam web, τότε δεν χρειάζεται να υλοποιήσετε τα πάντα από την αρχή, ειδικά ασχολείται με όλα τα ζητήματα που έπρεπε να αντιμετωπίσουμε πριν από εσάς. Απλά χρησιμοποιήστε μας Bot. rchiWebHandler
που ήδη εκθέτει πολλές μεθόδους UrlWithSession()
για να χρησιμοποιήσετε, διαχείριση όλων των χαμηλότερου επιπέδου πραγμάτων όπως έλεγχος ταυτότητας, ανανέωση συνεδρίας ή περιορισμός για εσάς. Ομοίως, για την αποστολή αιτημάτων ιστού έξω από την πλατφόρμα Steam, θα μπορούσατε να χρησιμοποιήσετε την τυπική κλάση .NET HttpClient
, αλλά είναι πολύ καλύτερη ιδέα να χρησιμοποιήσετε το Bot. rchiWebHandler.WebBrowser
που είναι διαθέσιμο για εσάς, το οποίο για άλλη μια φορά σας προσφέρει ένα χρήσιμο χέρι, για παράδειγμα όσον αφορά την επανάληψη αποτυχημένων αιτημάτων.
Έχουμε μια πολύ ανοικτή πολιτική όσον αφορά τη διαθεσιμότητα API μας, οπότε αν θα θέλατε να χρησιμοποιήσετε κάτι που περιλαμβάνει ήδη τον κώδικα ASF, απλά ανοίξτε ένα ζήτημα και εξηγήστε σε αυτό την περίπτωση προγραμματισμένης χρήσης του εσωτερικού API του ASF μας. Το πιθανότερο είναι ότι δεν θα έχουμε τίποτα κατά, αρκεί η περίπτωση χρήσης σας να έχει νόημα. Αυτό περιλαμβάνει επίσης όλες τις προτάσεις σχετικά με τις νέες διεπαφές IPlugin
που θα μπορούσαν να προστεθούν προκειμένου να επεκταθεί η υπάρχουσα λειτουργικότητα.
Ανεξάρτητα από τη διαθεσιμότητα ASF API ωστόσο, τίποτα δεν σας σταματά π.χ. από την ενσωμάτωση του Discord. et
βιβλιοθήκη στην εφαρμογή σας και δημιουργώντας μια γέφυρα μεταξύ του Discord bot και των εντολών ASF, δεδομένου ότι το plugin σας μπορεί επίσης να έχει εξαρτήσεις από μόνο του. Οι δυνατότητες είναι ατελείωτες, και κάναμε ό,τι καλύτερο μπορούσαμε για να σας δώσουμε όσο το δυνατόν περισσότερη ελευθερία και ευελιξία μέσα στο plugin σας, έτσι δεν υπάρχουν τεχνητά όρια σε οτιδήποτε - plugin σας φορτώνεται στην κύρια διαδικασία ASF και μπορεί να κάνει οτιδήποτε είναι ρεαλιστικά δυνατό να κάνει μέσα από τον κώδικα C#.
Είναι σημαντικό να τονίσουμε ότι το ASF είναι μια εφαρμογή καταναλωτή και όχι μια τυπική βιβλιοθήκη με σταθερή επιφάνεια API που μπορείτε να εξαρτηθείτε από άνευ όρων. Αυτό σημαίνει ότι δεν μπορείτε να υποθέσετε ότι το plugin σας μόλις μεταγλωττιστεί θα συνεχίσει να λειτουργεί με όλες τις μελλοντικές εκδόσεις του ASF σχετικά, είναι απλά αδύνατο αν θέλουμε να συνεχίσουμε να αναπτύσσουμε το πρόγραμμα περαιτέρω, και δεν είναι σε θέση να προσαρμοστούν σε συνεχείς αλλαγές Steam για λόγους καθυστερημένης συμβατότητας απλά δεν είναι κατάλληλο για την περίπτωσή μας. Αυτό θα πρέπει να είναι λογικό για σας, αλλά είναι σημαντικό να τονιστεί αυτό το γεγονός.
Θα κάνουμε ό,τι καλύτερο μπορούμε για να διατηρήσουμε τα δημόσια τμήματα του ASF λειτουργώντας και σταθερά, αλλά δεν θα φοβόμαστε να σπάσει τη συμβατότητα αν προκύπτουν αρκετά καλοί λόγοι, ακολουθώντας την πολιτική μας deprecation στη διαδικασία. Αυτό είναι ιδιαίτερα σημαντικό όσον αφορά τις εσωτερικές δομές ASF που είναι εκτεθειμένες σε εσάς ως μέρος της υποδομής ASF (π.χ. ArchiWebHandler
) το οποίο θα μπορούσε να βελτιωθεί (και επομένως να ξαναγραφεί) ως μέρος των βελτιώσεων του ASF σε μια από τις μελλοντικές εκδόσεις. Θα κάνουμε ό,τι καλύτερο μπορούμε για να σας ενημερώσουμε κατάλληλα στα changelogs, και να συμπεριλάβουμε κατάλληλες προειδοποιήσεις κατά τη διάρκεια του runtime σχετικά με τα απαρχαιωμένα χαρακτηριστικά. Δεν σκοπεύουμε να ξαναγράψουμε τα πάντα για χάρη της επανασυγγραφής του, ώστε να μπορείτε να είστε αρκετά σίγουροι ότι η επόμενη δευτερεύουσα έκδοση ASF δεν θα καταστρέψει απλά το plugin σας εξ ολοκλήρου μόνο και μόνο επειδή έχει υψηλότερο αριθμό έκδοσης, but keeping an eye on changelogs and occasional verification if everything works fine is a very good idea.
Το πρόσθετο θα περιλαμβάνει τουλάχιστον δύο εξαρτήσεις από προεπιλογή, την αναφορά ArchiSteamFarm
για εσωτερικό API (IPlugin
τουλάχιστον) και την αναφορά PackageReference
του System. omposition.AttributedModel
που απαιτείται για να αναγνωριστεί ως πρόσθετο ASF για να ξεκινήσει με ([Export]
clause). Εκτός από αυτό, μπορεί να περιλαμβάνει περισσότερες εξαρτήσεις σε σχέση με το τι έχετε αποφασίσει να κάνετε στο plugin σας (π. χ. . Discord.Net
βιβλιοθήκη αν έχετε αποφασίσει να ενσωματώσετε με το Discord).
Η έξοδος της κατασκευής σας θα περιλαμβάνει τον πυρήνα της βιβλιοθήκης YourPluginName.dll
, καθώς και όλες τις εξαρτήσεις που αναφέρατε. Δεδομένου ότι αναπτύσσετε ένα plugin για να ήδη λειτουργήσει-πρόγραμμα, δεν χρειάζεται να, ακόμα και δεν πρέπει να περιλαμβάνουν εξαρτήσεις που το ASF περιλαμβάνει ήδη, για παράδειγμα ArchiSteamFarm
, SteamKit2
ή AngleSharp
. Η απογύμνωση των εξαρτήσεων που μοιράζονται με το ASF δεν είναι η απόλυτη απαίτηση για να λειτουργήσει το plugin σας, αλλά αυτό θα κόψει δραματικά το αποτύπωμα μνήμης και το μέγεθος του plugin σας, μαζί με την αύξηση της απόδοσης, λόγω του γεγονότος ότι η ASF θα μοιραστεί τις δικές της εξαρτήσεις μαζί σας, και θα φορτώσει μόνο τις βιβλιοθήκες που δεν ξέρει για τον εαυτό της.
Γενικά, είναι μια συνιστώμενη πρακτική να συμπεριληφθούν μόνο οι βιβλιοθήκες που το ASF είτε δεν περιλαμβάνει, είτε περιλαμβάνει στην λανθασμένη/ασυμβίβαστη έκδοση. Παραδείγματα αυτών θα ήταν προφανώς το YourPluginName.dll
, αλλά για παράδειγμα το Discord.Net.dll
αν αποφασίσατε να εξαρτηθείτε από αυτό, καθώς το ASF δεν το συμπεριλαμβάνει. Οι βιβλιοθήκες ομαδοποίησης που μοιράζονται με το ASF μπορούν ακόμα να έχουν νόημα αν θέλετε να εξασφαλίσετε συμβατότητα API (π.χ. βεβαιωθείτε ότι το AngleSharp
από το οποίο εξαρτάστε από το πρόσθετο σας θα είναι πάντα στην έκδοση X
και όχι σε αυτό με το οποίο αποστέλλει το ASF), αλλά προφανώς αυτό έρχεται για μια τιμή της αυξημένης μνήμης/μεγέθους και χειρότερη απόδοση, και ως εκ τούτου θα πρέπει να αξιολογηθεί προσεκτικά.
Εάν γνωρίζετε ότι η εξάρτηση που χρειάζεστε περιλαμβάνεται στην ASF, μπορείτε να το σημειώσετε με το IncludeAssets="compile"
όπως σας δείξαμε στο παράδειγμα csproj
παραπάνω. Αυτό θα πει στον μεταγλωττιστή να αποφύγει τη δημοσίευση αναφερόμενη βιβλιοθήκη, καθώς η ASF ήδη περιλαμβάνει αυτή την μία. Ομοίως, Παρατηρήστε ότι αναφέρουμε το έργο ASF με το ExcludeAssets="all" Private="false"
το οποίο λειτουργεί με πολύ παρόμοιο τρόπο - λέγοντας στον μεταγλωττιστή να μην παράγει κανένα αρχείο ASF (όπως τα έχει ήδη ο χρήστης). Αυτό ισχύει μόνο κατά την αναφορά του έργου ASF, δεδομένου ότι αν αναφέρετε μια βιβλιοθήκη dll
, τότε δεν παράγετε αρχεία ASF ως μέρος του πρόσθετου σας.
Εάν είστε μπερδεμένοι με την παραπάνω δήλωση και δεν γνωρίζετε καλύτερα, ελέγξτε ποιες βιβλιοθήκες dll
περιλαμβάνονται στο ASF-generic. ip
πακέτο και βεβαιωθείτε ότι το plugin σας περιλαμβάνει μόνο αυτά που δεν είναι ακόμα μέρος του. Αυτό θα είναι μόνο το YourPluginName.dll
για τα πιο απλά plugins. Εάν έχετε οποιαδήποτε προβλήματα κατά τη διάρκεια του χρόνου εκτέλεσης σε σχέση με ορισμένες βιβλιοθήκες, περιλαμβάνουν και εκείνες που επηρεάζονται βιβλιοθήκες. Αν όλα αποτύχουν, μπορείτε πάντα να αποφασίσετε να συνδυάσετε τα πάντα.
Οι εγγενείς εξαρτήσεις δημιουργούνται ως μέρος των συγκεκριμένων κτιρίων OS, καθώς δεν υπάρχει. ET χρόνος εκτέλεσης διαθέσιμο στον κεντρικό υπολογιστή και ASF εκτελείται μέσω του δικού του χρόνου εκτέλεσης .NET που δεσμοποιείται ως μέρος της συγκεκριμένης κατασκευής OS. Προκειμένου να ελαχιστοποιηθεί το μέγεθος της κατασκευής, το ASF περικλείει τις αυτόχθονες εξαρτήσεις του, ώστε να περιλαμβάνει μόνο τον κώδικα που μπορεί να επιτευχθεί στο πλαίσιο του προγράμματος, το οποίο κόβει αποτελεσματικά τα αχρησιμοποίητα μέρη του χρόνου εκτέλεσης. Αυτό μπορεί να δημιουργήσει ένα πιθανό πρόβλημα για σας σε σχέση με το plugin σας, αν ξαφνικά μπορείτε να βρείτε τον εαυτό σας σε μια κατάσταση όπου plugin σας εξαρτάται από κάποια . Χαρακτηριστικό ET που δεν χρησιμοποιείται στο ASF και επομένως οι εκδόσεις για συγκεκριμένα OS δεν μπορούν να το εκτελέσουν σωστά, συνήθως ρίχνουν System.MissingMethodException
ή System.Reflection.ReflectionTypeLoadException
στη διαδικασία. Όπως plugin σας μεγαλώνει σε μέγεθος και γίνεται όλο και πιο περίπλοκη, αργά ή γρήγορα θα χτυπήσει την επιφάνεια που δεν καλύπτεται από την συγκεκριμένη κατασκευή του OS.
Αυτό δεν είναι ποτέ ένα πρόβλημα με τα γενικά κτίρια, επειδή αυτοί δεν ασχολούνται ποτέ με αυτόχθονες εξαρτήσεις στην πρώτη θέση (όπως έχουν πλήρη χρόνο εργασίας στον οικοδεσπότη, εκτέλεση ASF). Αυτός είναι ο λόγος για τον οποίο είναι μια προτεινόμενη πρακτική να χρησιμοποιήσετε το πρόσθετο σας σε γενικές εκδόσεις αποκλειστικά, αλλά προφανώς αυτό έχει το δικό του μειονέκτημα της κοπής plugin σας από τους χρήστες που τρέχουν OS-συγκεκριμένες εκδόσεις του ASF. Αν αναρωτιέστε αν το θέμα σας σχετίζεται με εγγενείς εξαρτήσεις, μπορείτε επίσης να χρησιμοποιήσετε αυτή τη μέθοδο για την επαλήθευση, φορτώστε το plugin σας σε ASF γενική κατασκευή και να δείτε αν λειτουργεί. Αν το κάνει, έχετε εξαρτήσεις plugin που καλύπτονται, και είναι οι εγγενείς εξαρτήσεις που προκαλούν προβλήματα.
Δυστυχώς, έπρεπε να κάνουμε μια δύσκολη επιλογή μεταξύ της δημοσίευσης ολόκληρου του χρόνου εκτέλεσης ως μέρος των συγκεκριμένων κτιρίων μας OS, και αποφασίζοντας να το κόψετε από μη χρησιμοποιημένα χαρακτηριστικά, καθιστώντας την κατασκευή πάνω από 80 MB μικρότερη σε σύγκριση με την πλήρης. Έχουμε επιλέξει τη δεύτερη επιλογή, και είναι δυστυχώς αδύνατο για σας να συμπεριλάβετε τα ελλείποντα χαρακτηριστικά του χρόνου εκτέλεσης μαζί με το plugin σας. Αν το έργο σας απαιτεί πρόσβαση σε λειτουργίες runtime που έχουν μείνει έξω, θα πρέπει να συμπεριλάβετε πλήρη . ET runtime από τον οποίο εξαρτάστε και αυτό σημαίνει ότι τρέχετε το plugin σας σε "generic" γεύση ASF. Δεν μπορείτε να εκτελέσετε το plugin σας σε συγκεκριμένες εκδόσεις OS, καθώς αυτές οι εκδόσεις απλά λείπουν ένα χαρακτηριστικό runtime που χρειάζεστε, και . ET runtime από τώρα δεν είναι σε θέση να "συγχωνεύσει" μητρική εξάρτηση που θα μπορούσατε να έχετε εφοδιάσει με το δικό μας. Ίσως θα βελτιωθεί μια μέρα στο μέλλον, αλλά από τώρα απλά δεν είναι δυνατό.
Οι εκδόσεις OS-του ASF περιλαμβάνουν το ελάχιστο πρόσθετο σύνολο λειτουργιών που απαιτείται για να τρέξει τα επίσημα plugins μας. Εκτός από αυτό είναι δυνατό, αυτό επεκτείνει ελαφρώς την επιφάνεια σε επιπλέον εξαρτήσεις που απαιτούνται για τα πιο βασικά plugins. Ως εκ τούτου, δεν είναι όλα τα plugins θα πρέπει να ανησυχείτε για εγγενείς εξαρτήσεις για να ξεκινήσετε - μόνο εκείνοι που υπερβαίνουν αυτό που ASF και τα επίσημα plugins μας χρειάζονται άμεσα. Αυτό γίνεται ως έξτρα αφού αν πρέπει να συμπεριλάβουμε κι εμείς οι ίδιοι πρόσθετες αυτόχθονες εξαρτήσεις για τη δική μας χρήση, ούτως ή άλλως, μπορούμε επίσης να τους στείλουμε απευθείας με το ASF, καθιστώντας τους διαθέσιμα, και ως εκ τούτου ευκολότερο να καλύψουν, επίσης για σας. Δυστυχώς, αυτό δεν είναι πάντα αρκετό, και όπως plugin σας παίρνει όλο και πιο περίπλοκη, η πιθανότητα να τρέξει σε περικοπή της λειτουργικότητας αυξάνεται. Ως εκ τούτου, συνήθως σας συνιστούμε να τρέξετε τα προσαρμοσμένα σας πρόσθετα σε «γενικό» γεύση ASF. Μπορείτε ακόμα να βεβαιωθείτε ότι OS-συγκεκριμένη κατασκευή του ASF έχει όλα όσα σας plugin απαιτεί για τη λειτουργικότητά του - αλλά δεδομένου ότι οι αλλαγές στις ενημερώσεις σας, καθώς και τη δική μας, μπορεί να είναι δύσκολο να διατηρηθεί.
Μερικές φορές μπορεί να είναι δυνατόν να "εργαστούν" ελλείπουσες δυνατότητες είτε χρησιμοποιώντας εναλλακτικές επιλογές ή επανεφαρμογή τους στο plugin σας. Ωστόσο, αυτό δεν είναι πάντα δυνατό ή βιώσιμο, ειδικά αν το χαρακτηριστικό που λείπει προέρχεται από τις εξαρτήσεις τρίτων που περιλαμβάνετε ως μέρος του πρόσθετου σας. Μπορείτε πάντα να προσπαθήσετε να εκτελέσετε plugin σας σε OS-συγκεκριμένη κατασκευή και να προσπαθήσει να το κάνει να λειτουργήσει. but it mightθα μπορούσε become too much hassleταλαιπωρία in the longrunμακροπρόθεσμα, ειδικά αν θέλετε από τον κώδικά σας να λειτουργήσει μόνο, αντί να αγωνιστεί με την επιφάνεια του ASF.
Το ASF σας προσφέρει δύο διεπαφές για την εφαρμογή αυτόματων ενημερώσεων στο πρόσθετο σας:
-
IGitHubPluginUpdates
που σας παρέχει εύκολο τρόπο για την εφαρμογή ενημερώσεων που βασίζονται στο GitHub, παρόμοια με το γενικό μηχανισμό ενημέρωσης του ASF -
IPluginUpdates
που σας παρέχει λειτουργία χαμηλότερου επιπέδου που επιτρέπει προσαρμοσμένο μηχανισμό ενημέρωσης, αν χρειάζεστε κάτι πιο περίπλοκο
Η ελάχιστη λίστα ελέγχου των πραγμάτων που απαιτούνται για να λειτουργούν οι ενημερώσεις:
- Πρέπει να δηλώσετε το
RepositoryName
, το οποίο καθορίζει από πού προέρχονται οι ενημερώσεις. - Θα πρέπει να χρησιμοποιήσετε τις ετικέτες και τις κυκλοφορίες που παρέχονται από το GitHub. Η ετικέτα πρέπει να είναι σε μορφή που μπορεί να παραστεί σε μια έκδοση πρόσθετου, π.χ.
1.0.0.0
. -
Version
ιδιότητα του πρόσθετου πρέπει να ταιριάζει με την ετικέτα από την οποία προέρχεται. Αυτό σημαίνει ότι το δυαδικό που είναι διαθέσιμο κάτω από την ετικέτα1.2.3.4
πρέπει να παρουσιαστεί ως1.2.3.4
. - Κάθε ετικέτα θα πρέπει να έχει την κατάλληλη έκδοση διαθέσιμη στο GitHub με zip αποδέσμευση αρχείου που περιλαμβάνει τα δυαδικά αρχεία plugin σας. Τα δυαδικά αρχεία που περιλαμβάνουν τις κλάσεις
IPlugin
πρέπει να είναι διαθέσιμα στον ριζικό κατάλογο μέσα στο αρχείο zip.
Αυτό θα επιτρέψει στον μηχανισμό στην ASF να:
- Επίλυση της τρέχουσας
Version
του πρόσθετου σας, π.χ.1.0.1
. - Χρησιμοποιήστε το GitHub API για να λάβετε την πιο πρόσφατη
tag
διαθέσιμη στοRepositoryName
repo, π.χ.1.0.2
. - Καθορίστε ότι
1.0.2
>1.0.1
, ελέγξτε την έκδοση της ετικέτας1.0.2
για να βρείτε το αρχείο.zip
με την ενημέρωση του πρόσθετου. - Κατεβάστε το αρχείο
.zip
, εξάγετε το και βάλτε το περιεχόμενό του στον κατάλογο που περιελάμβανε τοYourPlugin.dll
πριν. - Επανεκκινήστε το ASF για να φορτώσετε το πρόσθετο σας στην έκδοση
1.0.2
.
Πρόσθετες σημειώσεις:
- Οι ενημερώσεις προσθέτων μπορεί να απαιτούν κατάλληλες τιμές ASF, δηλαδή
PluginsUpdateMode
και/ήPluginsUpdateList
. - Το πρότυπο plugin μας περιλαμβάνει ήδη όλα όσα χρειάζεστε, απλά rename το πρόσθετο σε σωστές τιμές και θα λειτουργήσει έξω από το πλαίσιο.
- Μπορείτε να χρησιμοποιήσετε συνδυασμό της τελευταίας έκδοσης καθώς και προ-εκδόσεις, θα χρησιμοποιηθούν σύμφωνα με το
UpdateChannel
που έχει ορίσει ο χρήστης. - Υπάρχει η δυαδική ιδιότητα
CanUpdate
που μπορείτε να παρακάμψετε για την απενεργοποίηση/ενεργοποίηση ενημέρωσης των plugins από την πλευρά σας, για παράδειγμα αν θέλετε να παραλείψετε ενημερώσεις προσωρινά, ή μέσω οποιουδήποτε άλλου λόγου. - Είναι δυνατό να έχετε πολλαπλά αρχεία zip στην έκδοση αν θέλετε να στοχεύσετε διαφορετικές εκδόσεις ASF. Βλέπε
GetTargetReleaseAsset()
remarks. Για παράδειγμα, μπορείτε να έχετε τοMyPlugin-V6-0.zip
καθώς και τοMyPlugin.zip
, το οποίο θα προκαλέσει το ASF στην έκδοσηV6. .x.x
για να επιλέξετε την πρώτη, ενώ όλες οι άλλες εκδόσεις ASF θα χρησιμοποιήσουν τη δεύτερη. - Αν τα παραπάνω δεν είναι επαρκή για εσάς και χρειάζεστε προσαρμοσμένη λογική για να επιλέξετε το σωστό ». ip
αρχείο, μπορείτε να παρακάμψετε τη λειτουργία
GetTargetReleaseAsset()` και να παρέχετε το τεχνούργημα για να χρησιμοποιήσει το ASF. - Εάν το πρόσθετο σας χρειάζεται να κάνει κάποια επιπλέον εργασία πριν/μετά την ενημέρωση, μπορείτε να παρακάμψετε τις μεθόδους
OnPluginUpdateProceeding()
και/ήOnPluginUpdateFinished()
.
Αυτό το περιβάλλον σας επιτρέπει να εφαρμόσετε προσαρμοσμένη λογική για ενημερώσεις, αν από οποιονδήποτε λόγο το IGithubPluginUpdates
δεν είναι αρκετό για εσάς, για παράδειγμα επειδή έχετε ετικέτες που δεν αναλύουν σε εκδόσεις, ή επειδή δεν χρησιμοποιείτε καθόλου την πλατφόρμα GitHub.
Υπάρχει μια μοναδική συνάρτηση GetTargetReleaseURL()
για να παρακάμψετε, η οποία αναμένει από εσάς το Uri?
της τοποθεσίας ενημέρωσης του πρόσθετου στόχου. ASF σας παρέχει ορισμένες βασικές μεταβλητές που σχετίζονται με το πλαίσιο με το οποίο κλήθηκε η λειτουργία, αλλά με διαφορετικό τρόπο, είστε υπεύθυνοι για την υλοποίηση όλων όσων χρειάζεστε σε αυτήν τη λειτουργία και την παροχή ASF της διεύθυνσης URL που θα χρησιμοποιηθεί, ή null
εάν η ενημέρωση δεν είναι διαθέσιμη.
Εκτός από αυτό, είναι παρόμοιο με τις ενημερώσεις του GitHub, όπου η διεύθυνση URL πρέπει να δείχνει σε ένα . ip
αρχείο με τα δυαδικά αρχεία που είναι διαθέσιμα στον ριζικό κατάλογο. Έχετε επίσης διαθέσιμες μεθόδους OnPluginUpdateProceeding()
και OnPluginUpdateFinished()
![]() |
![]() |
![]() |
![]() |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
---|---|---|---|
- 🏡 Αρχική
- 🔧 Παραμετροποίηση
- 💬 Συχνές Ερωτήσεις
- ⚙️ Ρύθμιση (ξεκινήστε εδώ)
- 👥 Εξαργύρωση παιχνιδιών παρασκηνίου
- 📢 Εντολές
- 🛠️ Συμβατότητα
- 🧩 ItemsMatcherPlugin
- 📋 Διαχείριση
- ⏱️ Επιδόσεις
- 📡 Απομακρυσμένη επικοινωνία
- 👪 Κοινή χρήση Steam με την οικογένεια
- 🔄 Ανταλλαγές