{"id":24383660,"url":"https://github.com/osbytes/devy","last_synced_at":"2026-03-02T15:46:02.073Z","repository":{"id":40492614,"uuid":"432276903","full_name":"osbytes/devy","owner":"osbytes","description":"Discord bot for dev hub discord channel","archived":false,"fork":false,"pushed_at":"2025-03-13T01:28:00.000Z","size":264,"stargazers_count":3,"open_issues_count":28,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-11T01:12:30.222Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/osbytes.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-11-26T19:04:59.000Z","updated_at":"2024-12-14T22:57:34.000Z","dependencies_parsed_at":"2024-11-08T18:29:35.699Z","dependency_job_id":"bc149a13-3933-4988-9ec2-c9c7a730d8f3","html_url":"https://github.com/osbytes/devy","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/osbytes/devy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osbytes%2Fdevy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osbytes%2Fdevy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osbytes%2Fdevy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osbytes%2Fdevy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/osbytes","download_url":"https://codeload.github.com/osbytes/devy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osbytes%2Fdevy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30008463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T15:15:59.058Z","status":"ssl_error","status_checked_at":"2026-03-02T15:15:58.758Z","response_time":60,"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":[],"created_at":"2025-01-19T10:15:26.645Z","updated_at":"2026-03-02T15:46:02.058Z","avatar_url":"https://github.com/osbytes.png","language":"Go","readme":"\u003ch1 style=\"border-bottom: none;\" align=\"center\"\u003eDevy\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./devy.svg\" height=\"175\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://codecov.io/gh/osbytes/devy\"\u003e\n        \u003cimg src=\"https://codecov.io/gh/osbytes/devy/branch/main/graph/badge.svg\" alt=\"codecov\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/osbytes/devy/blob/main/LICENSE\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/license/osbytes/devy.svg\" alt=\"License\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nA developer focused discord bot written in go\n\n## How to Get Started\n\nInstall all go dependencies\n\n```sh\ngo get ./...\n```\n\n### Run the app\n\nCopy `.env.sample` to `.env` and add secrets\n\n```sh\ncp .env.sample .env\n```\n\nInstall [godotenv](https://github.com/joho/godotenv)\n\n```sh\ngo install github.com/joho/godotenv/cmd/godotenv@latest\n```\n\nRun the following command to run the application.\n\n```sh\ngodotenv -f .env go run cmd/bot/main.go\n```\n\n## Stack\n\n- Go v1.17\n- Discord\n\n## How to Contribute\n\n- Fork the project\n- Push changes\n- Create a PR and add reveiwers\n\nNote: If you grab an issue that is labled TODO, please delete the TODO comment.\n\n## How to Test on a Test Bot\n\n## Testing\n\nIf you are adding a test please make sure to delete any of the todo comment once you push your changes\n\n```go\n// TODO Tests: GetFirstContributionYearByUsername\n// labels: tests\nfunc TestGetFirstContributionYearByUsername(t *testing.T) {\n\n}\n\n// TODO Tests: GetFirstContributionYearByUsername\n// labels: tests\nfunc TestGetFirstContributionYearByUsername(t *testing.T) {\n\n}\n```\n\n### Test Naming\n\n```go\n// function to test\nfunc (g *GithubService) GetContributionsByUsername() {\n    // logic\n}\n\n// notice the naming for the main test for GetContributionsByUsername\n// the struct followed but a single underscore and the receiver method name\nfunc TestGithubService_GetContributionsByUsername(t *testing.T) {\n    // test\n}\n\n// test modifiers are separated by a double underscore followed by what you are testing for\nfunc TestGithubService_GetContributionsByUsername__MultiYear(t *testing.T) {\n    // test\n}\n\n```\n\n### Mocking\n\nRun the command below to mock all of your interfaces\n\nPull mockery docker image\n\n```sh\ndocker pull vektra/mockery\n```\n\nRun this in devy, replace pwd with root pwd\n\n```sh\ndocker run -v \"$PWD\":/src -w /src vektra/mockery --all\n```\n\nFor in package\n\n```sh\ndocker run -v \"$PWD\":/src -w /src vektra/mockery --all --inpackage\n```\n\nIf you need to monkey patch or create pointer functions follow this convention\n\n```go\n// keep the pointer functions at the top of the file\nvar (\n    doSomethingF = doSomething\n)\n\n// make sure in the implementation you call the pointer\nfunc GetContributionsByUsername() {\n    something, err := doSomethingF(args)\n}\n\n// now you can mock that function\nfunc TestGetContributionsByUsername(t *testing.T) {\n    doSomethingF = func(args) (something, error) { return something, err }\n}\n\n```\n\n## Ideas\n\n- [ ] Forces you to change nick name to real name\n- [ ] Displays github data\n- [ ] Gives us newest fireship videos\n- [ ] Scrapes for new changes to certain lang's\n- [ ] Coding challenges and scoreboards\n- [ ] Maybe something with leetcode\n- [ ] New Job openings for those looking for a new job\n\n## Known Issues\n\nError displaying in console\n\n```sh\nYYYY/MM/DD hh:mm:ss error closing resp body\n```\n\nhttps://github.com/bwmarrin/discordgo/issues/1028\nhttps://github.com/golang/go/issues/49366\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosbytes%2Fdevy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fosbytes%2Fdevy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosbytes%2Fdevy/lists"}