{"id":41147532,"url":"https://github.com/kyoukaya/angelina","last_synced_at":"2026-01-22T18:58:25.143Z","repository":{"id":49634361,"uuid":"241326904","full_name":"kyoukaya/angelina","owner":"kyoukaya","description":"Event driven websocket interface to get a Arknight client's state","archived":false,"fork":false,"pushed_at":"2021-06-11T18:01:26.000Z","size":83,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T22:36:41.938Z","etag":null,"topics":["arknights","websocket"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kyoukaya.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-18T09:56:48.000Z","updated_at":"2020-03-19T09:23:56.000Z","dependencies_parsed_at":"2022-07-29T00:37:55.974Z","dependency_job_id":null,"html_url":"https://github.com/kyoukaya/angelina","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/kyoukaya/angelina","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kyoukaya%2Fangelina","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kyoukaya%2Fangelina/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kyoukaya%2Fangelina/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kyoukaya%2Fangelina/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kyoukaya","download_url":"https://codeload.github.com/kyoukaya/angelina/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kyoukaya%2Fangelina/sbom","scorecard":{"id":575636,"data":{"date":"2025-08-11","repo":{"name":"github.com/kyoukaya/angelina","commit":"6212a9efef3e48fc5afb6e02f2359f00e42ce76d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.0-alpha not signed: https://api.github.com/repos/kyoukaya/angelina/releases/24458748","Warn: release artifact v0.1.0-alpha does not have provenance: https://api.github.com/repos/kyoukaya/angelina/releases/24458748"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-95 / GHSA-8ch4-58qp-g3mp","Warn: Project is vulnerable to: GO-2023-1941 / GHSA-4r8x-2p26-976p"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T17:37:42.332Z","repository_id":49634361,"created_at":"2025-08-20T17:37:42.332Z","updated_at":"2025-08-20T17:37:42.332Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28668769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T17:07:18.858Z","status":"ssl_error","status_checked_at":"2026-01-22T17:05:02.040Z","response_time":144,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arknights","websocket"],"created_at":"2026-01-22T18:58:24.415Z","updated_at":"2026-01-22T18:58:25.134Z","avatar_url":"https://github.com/kyoukaya.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# angelina\n\nA websocket server built on top of [Rhine](https://github.com/kyoukaya/rhine) that acts as a messenger, allowing clients to listen on game events and pull information from a user's game state from any programming language with a websocket library.\n\n## Usage\n\nangelina can be used as a rhine module and incorporated into a go program, see [main.go](https://github.com/kyoukaya/angelina/blob/master/cmd/main.go).\nIt can also be used standalone either from a [binary release](https://github.com/kyoukaya/angelina/releases) for users, or simply `go run cmd/main.go` for developers.\n\n```\n$ ./main.exe -help\nUsage of C:\\Users\\kaya\\Documents\\ange\\angelina\\main.exe:\n  -ange-host string\n        host on which ange is served (default \":8000\")\n  -ange-static string\n        path to static files to serve on the root URL. Serving disabled if empty string.\n  -disable-cert-store\n        disables the built in certstore, reduces memory usage but increases HTTP latency and CPU usage\n  -filter\n        enable the host filter\n  -host string\n        host on which the proxy is served (default \":8080\")\n  -log-path string\n        file to output the log to (default \"logs/proxy.log\")\n  -no-unk-json\n        disallows unknown fields when unmarshalling json in the gamestate module\n  -silent\n        don't print anything to stdout\n  -unsafe-origin\n        allow any HTTP request, no matter what origin they specify, to upgrade into a ws connection\n  -v    print Rhine verbose messages\n  -v-goproxy\n        print verbose goproxy messages\n```\n\n## Protocol\n\nAngelina communicates over text mode websockets, marshalling native data structures to JSON.\nAll messages begin with an opcode, if the message contains a payload it will be separated from the opcode with a single space. Messages received from the websocket client are guaranteed to be read and processed in the order that they were sent.\nExample of communications with angelina over websockets, with the [websocat client](https://github.com/vi/websocat), can be seen below, comment lines prefaced with `//`.\nFurther documentation of individual messages can be found [here](https://github.com/kyoukaya/angelina/blob/master/angelina/msg/doc.go).\n\n```\n$ websocat ws://localhost:8000/ws\n// Upon connecting with the angelina, the server sends S_UserList which contains an array of\n// IDs of all game users already connected. The ID will be used for attaching to one of them.\nS_UserList [\"GL_99999\"]\n// If a game user connects after the websocket client connects, a S_NewUser message is sent\n// to the connected websocket clients.\nS_NewUser \"JP_99999\"\n// Client messages always begin with \"C_\" while server messages begin with \"S_\"\n// C_Attach is sent from the websocket client to request for the server to attach them to the\n// specified game user. A websocket client can only be attached to one user at a time and it\n// is required for hooking and getting information from their game state.\nC_Attach \"GL_99999\"\n// S_Attached is a confirmation from the server that the websocket client is attached.\nS_Attached \"GL_99999\"\n// Once attached, the websocket client can send C_Get, C_Hook, C_Detach messages.\n// C_Hook requests a hook to be made on either a certain packet being received or if there's\n// a change to the gamestate in a certain path. The event value specifies if the websocket\n// client only needs to be notified of the change or packet and not sent the data itself.\nC_Hook {\"type\":\"gamestate\", \"target\": \"inventory\", \"event\": false}\nS_Hooked {\"id\":\"0\",\"type\":\"gamestate\",\"target\":\"inventory\",\"event\":false}\n// S_HookEvt are sent whenever the game user generates an event that triggers one of the hooks\n// the websocket client has registered. The data field may be omitted if the hook is an event hook.\nS_HookEvt {\"type\":\"gamestate\",\"target\":\"inventory\",\"data\":{\"2001\":271,\"2002\":41,\"2003\":25}}\n// Clients can stop listening on an event with C_Unhook.\nC_Unhook \"0\"\nS_Unhooked \"0\"\n// C_Get requests a piece of information from the attached user's game state.\nC_Get \"user\"\n// If an error occured during processing of any messages, the server will send a S_Error\n// message containing the error and the message that caused the error.\nS_Error {\"error\":\"Unable to find the key\",\"request\":\"C_Get \\\"user\\\"\"}\nC_Get \"status.socialPoint\"\n// S_Get returns the path of the request and the information requested.\nS_Get {\"path\":\"status.socialPoint\",\"data\":78}\n// C_Detach unhooks all registered hooks and allows the websocket client to attach to another user.\nC_Detach\nS_Detached\n```\n\n## Examples\n\n- [Recruitment Tag Calculator](https://github.com/kyoukaya/angelina/tree/master/example_clients/python) is a simple Python3 cli application that prints recruitment tag combinations that guarantee a 4* or higher when recruiting.\n- [ifrit](https://github.com/kyoukaya/ifrit) is a multi-purpose web based toolkit written in Vue.js + Typescript currently in development.\nangelina's static file serving capability is intended for use with such frameworks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkyoukaya%2Fangelina","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkyoukaya%2Fangelina","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkyoukaya%2Fangelina/lists"}