diff --git a/app/Http/Controllers/SkinlibController.php b/app/Http/Controllers/SkinlibController.php
index 503465f0..a8660b0a 100644
--- a/app/Http/Controllers/SkinlibController.php
+++ b/app/Http/Controllers/SkinlibController.php
@@ -10,6 +10,7 @@ use Storage;
use App\Models\User;
use App\Models\Player;
use App\Models\Texture;
+use App\Services\Filter;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
@@ -111,7 +112,7 @@ class SkinlibController extends Controller
]);
}
- public function show($tid)
+ public function show(Filter $filter, $tid)
{
$texture = Texture::find($tid);
$user = Auth::user();
@@ -133,6 +134,16 @@ class SkinlibController extends Controller
}
}
+ $badges = [];
+ $uploader = User::find($texture->uploader);
+ if ($uploader) {
+ if ($uploader->isAdmin()) {
+ $badges[] = ['text' => 'STAFF', 'color' => 'primary'];
+ }
+
+ $badges = $filter->apply('user_badges', $badges, [$uploader]);
+ }
+
$commentScript = get_string_replaced(
option('comment_script'),
[
@@ -152,6 +163,7 @@ class SkinlibController extends Controller
'inCloset' => $user && $user->closet()->where('tid', $texture->tid)->count() > 0,
'nickname' => ($up = User::find($texture->uploader)) ? $up->nickname : null,
'report' => intval(option('reporter_score_modification', 0)),
+ 'badges' => $badges,
]);
}
diff --git a/app/Http/View/Composers/UserPanelComposer.php b/app/Http/View/Composers/UserPanelComposer.php
index d0f3ff40..619770bb 100644
--- a/app/Http/View/Composers/UserPanelComposer.php
+++ b/app/Http/View/Composers/UserPanelComposer.php
@@ -22,6 +22,9 @@ class UserPanelComposer
$avatar = url('avatar/45/'.base64_encode($user->email).'.png?tid='.$user->avatar);
$badges = [];
+ if (auth()->user()->isAdmin()) {
+ $badges[] = ['text' => 'STAFF', 'color' => 'primary'];
+ }
$this->dispatcher->dispatch(new \App\Events\RenderingBadges($badges));
$view->with([
diff --git a/app/Services/Hook.php b/app/Services/Hook.php
index 86663a20..b571a1e0 100644
--- a/app/Services/Hook.php
+++ b/app/Services/Hook.php
@@ -125,7 +125,7 @@ class Hook
Event::listen(
Events\RenderingBadges::class,
function (Events\RenderingBadges $event) use ($text, $color) {
- $event->badges[] = [$text, $color];
+ $event->badges[] = compact('text', 'color');
}
);
}
diff --git a/resources/assets/src/views/skinlib/Show.vue b/resources/assets/src/views/skinlib/Show.vue
index 49b9829b..29be227f 100644
--- a/resources/assets/src/views/skinlib/Show.vue
+++ b/resources/assets/src/views/skinlib/Show.vue
@@ -130,6 +130,13 @@
{{ uploaderNickName }}
+
+ {{ badge.text }}
|
@@ -256,6 +263,7 @@ export default {
admin: blessing.extra.admin,
uploaderNickName: blessing.extra.nickname,
reportScore: blessing.extra.report,
+ badges: blessing.extra.badges,
}
},
computed: {
@@ -422,4 +430,6 @@ export default {
diff --git a/resources/assets/tests/views/skinlib/Show.test.ts b/resources/assets/tests/views/skinlib/Show.test.ts
index a772f05f..017bf877 100644
--- a/resources/assets/tests/views/skinlib/Show.test.ts
+++ b/resources/assets/tests/views/skinlib/Show.test.ts
@@ -14,13 +14,16 @@ type Component = Vue & {
type: 'steve' | 'alex' | 'cape'
}
-window.blessing.extra = {
- download: true,
- currentUid: 0,
- admin: false,
- nickname: 'author',
- inCloset: false,
-}
+beforeEach(() => {
+ window.blessing.extra = {
+ download: true,
+ currentUid: 0,
+ admin: false,
+ nickname: 'author',
+ inCloset: false,
+ badges: [],
+ }
+})
const previewer = Vue.extend({
render(h) {
@@ -53,6 +56,7 @@ test('button for adding to closet should be enabled if auth', () => {
test('likes count indicator', async () => {
Vue.prototype.$http.get.mockResolvedValue({ data: { likes: 2 } })
+ Object.assign(window.blessing.extra, { inCloset: true, currentUid: 1 })
const wrapper = mount(Show, {
mocks: {
$route: ['/skinlib/show/1', '1'],
@@ -384,6 +388,7 @@ test('delete texture', async () => {
})
test('report texture', async () => {
+ Object.assign(window.blessing.extra, { currentUid: 1 })
Vue.prototype.$http.get.mockResolvedValue({ data: { report: 0 } })
Vue.prototype.$http.post
.mockResolvedValueOnce({ code: 1, message: 'duplicated' })
@@ -439,6 +444,7 @@ test('report texture', async () => {
})
test('apply texture to player', () => {
+ Object.assign(window.blessing.extra, { currentUid: 1, inCloset: true })
Vue.prototype.$http.get
.mockResolvedValue({ data: {} })
.mockResolvedValue([])
@@ -466,3 +472,17 @@ test('truncate too long texture name', async () => {
await flushPromises()
expect(wrapper.find('.card-primary').text()).toContain('very-very-long-...')
})
+
+test('render badges', async () => {
+ Vue.prototype.$http.get.mockResolvedValue({ data: {} })
+ Object.assign(window.blessing.extra, {
+ badges: [{ text: 'reina', color: 'purple' }]
+ })
+ const wrapper = mount(Show, {
+ mocks: {
+ $route: ['/skinlib/show/1', '1'],
+ },
+ })
+ await flushPromises()
+ expect(wrapper.find('.badge.bg-purple').text()).toBe('reina')
+})
diff --git a/resources/misc/changelogs/en/5.0.0.md b/resources/misc/changelogs/en/5.0.0.md
index 223d70f8..0c9b5ca0 100644
--- a/resources/misc/changelogs/en/5.0.0.md
+++ b/resources/misc/changelogs/en/5.0.0.md
@@ -12,6 +12,8 @@
- Spanish support (Greatly thanks [@poopingpenis](https://github.com/poopingpenis))
- Brand new website theme color settings.
- Detect Readme file of plugin automatically.
+- Added badge "STAFF" for administrators.
+- Added badges at texture detail page.
## Tweaked
diff --git a/resources/misc/changelogs/zh_CN/5.0.0.md b/resources/misc/changelogs/zh_CN/5.0.0.md
index c6dd40d1..f4c3ff74 100644
--- a/resources/misc/changelogs/zh_CN/5.0.0.md
+++ b/resources/misc/changelogs/zh_CN/5.0.0.md
@@ -12,6 +12,8 @@
- 西班牙语支持(感谢 [@poopingpenis](https://github.com/poopingpenis))
- 全新的站点配色设置
- 自动识别插件的说明文件
+- 增加管理员专有的「STAFF」badge
+- 在材质详情页中显示上传者的 badge
## 调整
diff --git a/resources/views/shared/user-panel.twig b/resources/views/shared/user-panel.twig
index b30f24f2..5084d8a6 100644
--- a/resources/views/shared/user-panel.twig
+++ b/resources/views/shared/user-panel.twig
@@ -10,7 +10,7 @@
{% for badge in badges %}
- {{ badge[0] }}
+ {{ badge.text }}
{% endfor %}
diff --git a/tests/HttpTest/ControllersTest/SkinlibControllerTest.php b/tests/HttpTest/ControllersTest/SkinlibControllerTest.php
index d39b7dd8..8f9f6a72 100644
--- a/tests/HttpTest/ControllersTest/SkinlibControllerTest.php
+++ b/tests/HttpTest/ControllersTest/SkinlibControllerTest.php
@@ -5,6 +5,7 @@ namespace Tests;
use App\Models\User;
use App\Models\Player;
use App\Models\Texture;
+use App\Services\Filter;
use Illuminate\Support\Str;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
@@ -317,6 +318,24 @@ class SkinlibControllerTest extends TestCase
$this->actingAs($uploader)
->get('/skinlib/show/'.$texture->tid)
->assertViewHas('texture');
+
+ // Badges.
+ $uploader->permission = User::ADMIN;
+ $uploader->save();
+ $this->get('/skinlib/show/'.$texture->tid)
+ ->assertSee('primary')
+ ->assertSee('STAFF');
+ $uid = $uploader->uid;
+ resolve(Filter::class)->add('user_badges', function ($badges, $uploader) use ($uid) {
+ $this->assertEquals($uid, $uploader->uid);
+
+ $badges[] = ['text' => 'badge-test', 'color' => 'maroon'];
+
+ return $badges;
+ });
+ $this->get('/skinlib/show/'.$texture->tid)
+ ->assertSee('badge-test')
+ ->assertSee('maroon');
}
public function testInfo()
diff --git a/tests/HttpTest/ViewTest/ComposersTest/UserPanelComposerTest.php b/tests/HttpTest/ViewTest/ComposersTest/UserPanelComposerTest.php
index 716b2d27..d983922e 100644
--- a/tests/HttpTest/ViewTest/ComposersTest/UserPanelComposerTest.php
+++ b/tests/HttpTest/ViewTest/ComposersTest/UserPanelComposerTest.php
@@ -24,9 +24,15 @@ class UserPanelComposerTest extends TestCase
$this->actingAs($user);
Event::listen(\App\Events\RenderingBadges::class, function ($event) {
- $event->badges[] = ['Pro', 'purple'];
+ $event->badges[] = ['text' => 'Pro', 'color' => 'purple'];
});
- $this->get('/user')->assertSee('Pro');
+ $this->get('/user')
+ ->assertSee('Pro');
+
+ $user->permission = User::ADMIN;
+ $user->save();
+ $this->get('/user')
+ ->assertSee('STAFF');
}
}